【问题标题】:"XXX is an interface and jaxb can't handle interface" error in liferay context only“XXX 是一个接口,而 jaxb 无法处理接口”错误仅在 liferay 上下文中
【发布时间】:2013-05-18 15:33:27
【问题描述】:

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

我使用以下方法调用网络方法:

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 错误 [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 接口。 此问题与以下位置有关: 在 org.tempuri.CheckConsistencyDocument$CheckConsistency 在公共抽象 org.tempuri.CheckConsistencyDocument$CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency() 在 org.tempuri.CheckConsistencyDocument org.datacontract.schemas.x2004.x07..TODemand est une interface et JAXB ne peut pas gérer les 接口。 此问题与以下位置有关: 在 org.datacontract.schemas.x2004.x07..TODemand 在公共抽象 org.datacontract.schemas.x2004.x07.*.TODemand org.tempuri.CheckConsistencyDocument$CheckConsistency.getEntity() 在 org.tempuri.CheckConsistencyDocument$CheckConsistency 在公共抽象 org.tempuri.CheckConsistencyDocument$CheckConsistency org.tempuri.CheckConsistencyDocument.getCheckConsistency() 在 org.tempuri.CheckConsistencyDocument

很多接口都重复这个错误。

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

【问题讨论】:

  • 您的模型是使用 XMLBeans 生成的,并且基于异常的模型正在由 JAXB 实现解释?您在使用 JAXB 时遇到的最初问题是什么?
  • 是的,我使用 XML bean 生成,但出现 jaxb 错误(但在简单的 java 程序中,它可以工作)。
  • 我使用 jaxb 生成 wsdl 时遇到的原始错误是: id 属性已定义。使用 来解决这个冲突。以下位置与上述错误匹配:http://*****/WcfDemandService.svc?xsd=xsd2 [0,0]:
  • 如果您有兴趣,我可以帮助您解决这个问题。
  • 问题是由于一个包含大量库的认可目录;当我删除它时,错误被删除了

标签: jaxb liferay cxf xmlbeans


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多