“XXX是一个接口,jaxb无法处理接口”仅在liferay上下文中出错

时间:2013-05-23 10:09:59

标签: jaxb liferay cxf xmlbeans

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

我使用以下方法调用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.CheckConsistencyDocumen是一个接口而jaxb可以' t处理接口):

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 IllegalAnnotationExceptions计数 org.tempuri.CheckConsistencyDocument est une interface et JAXB ne peutpasgérerlesinterfaces。     此问题与以下位置有关:         在org.tempuri.CheckConsistencyDocument org.tempuri.CheckConsistencyDocument $ CheckConsistency est une interface et JAXB ne peutpasgérerlesinterfaces。     此问题与以下位置有关:         在org.tempuri.CheckConsistencyDocument $ CheckConsistency         at public abstract org.tempuri.CheckConsistencyDocument $ CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency()         在org.tempuri.CheckConsistencyDocument org.datacontract.schemas.x2004.x07。 .TODemand est une interface et JAXB ne peutpasgérerlesinterfaces。     此问题与以下位置有关:         在org.datacontract.schemas.x2004.x07。 .TODemand         在公共摘要org.datacontract.schemas.x2004.x07。 * .TODemand org.tempuri.CheckConsistencyDocument $ CheckConsistency.getEntity()         在org.tempuri.CheckConsistencyDocument $ CheckConsistency         at public abstract org.tempuri.CheckConsistencyDocument $ CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency()         在org.tempuri.CheckConsistencyDocument

许多接口都会重复此错误。

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

3 个答案:

答案 0 :(得分:1)

在这种情况下,您没有使用CXF。堆栈跟踪(com.sun.xml.ws.spi ....)显示您正在使用Metro,而不是CXF。检查您的类路径等,以确保您确实使用CXF。如果你想坚持使用,CXF应该能够使用XMLBeans。 (尽管使用Blaise的基于JAXB的解决方案可能更好)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果使用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());