仅在Liferay上下文中"XXX is an interface and jaxb can't handle interface"错误



我使用CXF 2.7.5调用Web服务。我使用wsdl2java程序(在命令行MSDOS和maven中)生成了客户机类。我必须使用xmlbeans数据绑定,因为使用jaxb(默认数据绑定)有一些错误,而且我无法修改服务器端。所以使用xmlbeans数据绑定参数生成是OK的。

我用以下方法调用web方法:

WcfDemandService service = new WcfDemandService();
IWcfDemandService client = service.getBasicHttpBindingIWcfDemandService();
TODemand ticketToSubmit = TODemand.Factory.newInstance();

boolean ret = client.submit(ticketToSubmit);

当我调用webmethods时,它在简单的java程序上工作得很好,但在portlet liferay上下文中不起作用:我有这个错误(在英语中,翻译是org.tempuri. checkconsistencydocumenten是一个接口,jaxb不能处理接口):

09:48:33,899 ERROR [http-bio-8080-exec-4][PortletServlet:115] javax.portlet.PortletException: com.sun.xml.ws.spi.db.DatabindingException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 149个illegalannotationexceptioncheckconsistencydocument测试一个接口和JAXB的新接口。这个问题与以下位置有关:在org.tempuri.CheckConsistencyDocumentorg.tempuri。CheckConsistencyDocument$CheckConsistency est une interface et JAXB nepeput pas samererles接口。这个问题与以下位置有关:org.tempuri.CheckConsistencyDocument CheckConsistency美元在公共文摘org.tempuri。美元CheckConsistencyDocument CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency ()在org.tempuri.CheckConsistencyDocumentorg.datacontract.schemas.x2004.x07。。TODemand测试一个接口和JAXB,并通过多个接口。这个问题与以下位置有关:在org.datacontract.schemas.x2004.x07。 .TODemand*。TODemand org.tempuri.CheckConsistencyDocument CheckConsistency.getEntity美元()org.tempuri.CheckConsistencyDocument CheckConsistency美元在公共文摘org.tempuri。美元CheckConsistencyDocument CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency ()在org.tempuri.CheckConsistencyDocument

这个错误在很多接口上重复出现。

你知道为什么这段代码不能在liferay上下文中工作吗?

在本例中没有使用CXF。堆栈跟踪(com.sun.xml. wss.spi ....)显示您正在使用Metro,而不是CXF。检查您的类路径等,以确保您确实在使用CXF。如果您想坚持使用XMLBeans,那么CXF应该能够使用它。(尽管使用Blaise提供的基于JAXB的解决方案可能更好)

问题是由于一个包含大量库的认可目录;当我删除它时,错误被删除了

如果这些类是使用XmlBeans生成的,那么您可以使用JaxWsProxyFactoryBean并显式地配置为使用XmlBeansDataBinding,因为CXF在其所有操作中使用JAXB默认值。

JaxWsProxyFactoryBean factory = new org.apache.cxf.jaxws.JaxWsProxyFactoryBean();
factory.setServiceClass(YourServiceInterface.class);
factory.setDataBinding(new XmlBeansDataBinding()); 
factory.setAddress(endPoint);
factory.getInInterceptors().add(new org.apache.cxf.interceptor.LoggingInInterceptor());
factory.getOutInterceptors().add(new org.apache.cxf.interceptor.LoggingOutInterceptor());

最新更新