2

我使用 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 不能处理接口) :

09:48:33,899 错误 [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 peut pas gérer les 接口。此问题与以下位置有关:在 org.tempuri.CheckConsistencyDocument org.tempuri.CheckConsistencyDocument$CheckConsistency est une interface et JAXB ne peut pas gérer les interfaces。此问题与以下位置有关:在公共摘要的 org.tempuri.CheckConsistencyDocument$CheckConsistency 处 org.tempuri.CheckConsistencyDocument$CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency() 在 org.tempuri。.TODemand est une interface et JAXB ne peut pas gérer les 接口。此问题与以下位置有关:在 org.datacontract.schemas.x2004.x07。公共摘要 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 上下文中不起作用吗?

4

3 回答 3

1

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

于 2013-05-23T13:21:21.150 回答
1

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

于 2013-05-24T14:09:08.600 回答
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());
于 2016-07-21T23:04:22.813 回答