java如何使用共享对象创建SOAP客户端
我试图创建一个java客户机来使用由另一个团队维护的SOAP服务
这些服务使用一系列相关的对象
- com。公司WSException
- com。公司顾客
- com。公司雇员
然后我有相应的WSDL文件:
- 服务。公司com/Customer。srv?wsdl
- 服务。公司com/Employee。srv?wsdl
当我在客户机上使用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
编辑
为了简洁起见,我把情况简化了很多。实际上,我正在处理十几个相关服务和wsdl文件,它们都使用各种共享对象,比如示例中的WSEception对象
编辑2
基于这张罚单,以及一系列额外的名字冲突,我刚刚发现,我认为这不值得自动化。我必须想出一个解决方案来处理这些服务当前实现中的混乱代码。至少在CXF开发团队提出更新以更好地处理此类重叠服务之前
# 1 楼答案
我也在Reddit上发布了这个问题,并收到了一个有趣的潜在解决方案。我把它贴在这里,以便其他人可以在需要时找到:http://www.reddit.com/r/java/comments/24ax71/having_trouble_using_soap_services_that_rely_on/ch5gond
# 2 楼答案
由于问题是每次连续的
ObjectFactory
代码生成都会覆盖上一次生成的代码,而不是累加生成的代码,因此您能否在生成下一次代码之前复制每一次,然后将它们合并如果这是需要自动化的东西,或者是Maven构建的一部分,那么这可能很棘手。但是,手动组合
ObjectFactory
定义应该并不困难,除非存在互不兼容的部分