如何使用共享对象创建SOAP客户端

时间:2014-04-28 21:06:30

标签: java wsdl2java

我试图创建一个java客户端来使用由另一个团队维护的SOAP服务。

服务使用一系列相关对象

  • com.company.WSException
  • com.company.Customer
  • com.company.Employee

然后我有相应的WSDL文件:

  • service.company.com/Customer.srv?wsdl
  • service.company.com/Employee.srv?wsdl

当我在Customer上使用wsdl2java时,服务很有效。员工也是如此。两个WSDL文件都创建WSException文件。我已经使用diff工具验证了生成的文件是否相同。但是,当我对wsdl2java运行wsdl2java时,我的测试程序引发了一系列例外。

为了测试我从命令行生成存根代码:

wsdl2java -client -impl -verbose -d src\main\java service.company.com/Customer.srv?wsdl
wsdl2java -client -impl -verbose -d src\main\java service.company.com/Employee.srv?wsdl

我之前通过为每个服务创建单独的绑定文件并将它们强制转换为单独的包来解决这个问题。然而,这会产生大量冗余代码,并且使得使用库非常麻烦。是否有更有效的方式来处理这样的相关服务?

为清楚起见,这里是我在同时使用这两种服务时得到的例外情况的示例:

Exception in thread "main" javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException
    at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:334)
    at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:319)
    at javax.xml.ws.Service.getPort(Service.java:119)
    at org.tempuri.People.getBasicHttpBindingIPeople(People.java:79)
    at com.gallup.oms.TestDriver.main(TestDriver.java:38)
Caused by: org.apache.cxf.service.factory.ServiceConstructionException
    at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:332)
    at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:434)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:538)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:252)
    at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:205)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
    at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
    at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:156)
    at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:156)
    at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:465)
    at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:332)
    ... 4 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 72 counts of IllegalAnnotationExceptions
There's no ObjectFactory with an @XmlElementDecl for the element {http://schemas.company.com/oms/2010/10/}request.
    this problem is related to the following location:
        at protected javax.xml.bind.JAXBElement com.company.schemas.oms._2010._10.AddPrivilege.request
        at com.gallup.schemas.oms._2010._10.AddPrivilege

修改

为简洁起见,我已大大简化了情况。实际上,我使用各种共享对象(如示例中的WSEception对象)处理十几个相关服务和wsdl文件。

编辑2

根据这张票,以及我发现的一系列其他名称冲突,我写这篇文章并不值得自动化。我必须提出一个解决方案来处理当前这些服务实现中的混乱代码。至少在CXF开发团队提出更新以更好地处理这样的重叠服务之前。

2 个答案:

答案 0 :(得分:1)

因为问题是每个连续的ObjectFactory代码生成都会覆盖最后一个,而不是加法,你可以在生成下一个之前复制每个代码,然后将它们组合起来吗?

如果这是需要自动化的东西,或Maven构建的一部分,那可能会很棘手。但是手动组合ObjectFactory定义并不困难,除非存在互不兼容的部分。

答案 1 :(得分:0)

我也在Reddit上发布了这个问题,并收到了一个有趣的潜在解决方案。我在这里发帖,以便其他人可以在需要时找到它:http://www.reddit.com/r/java/comments/24ax71/having_trouble_using_soap_services_that_rely_on/ch5gond