我使用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上下文中不起作用吗?
答案 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());