wsimport:多个wsdl覆盖ObjectFactory

7

我有多个(假设为2个,A和B)Web服务,我需要生成一个客户端来一起使用它们。 在Netbeans中,我使用“新建Web服务客户端”向导,传递这两个WSDL文件,查看输出时,Netbeans会分别调用wsimport。

wsimport http:/mydomain/wsA.svc?wsdl
wsimport http:/mydomain/wsB.svc?wsdl

无论是A还是B,都生成了相同的包com.mydomain.myapp(我猜它们被定义在相同的命名空间中),所以我获得了A和B的存根类集合并合并到同一个包中。

然而,wsimport还为每个Web服务创建了一个ObjectFactory,因此如果我在A之后生成B的存根,则仅获得与B定义相关的ObjectFactory(因为第一个A被覆盖了)。相反,如果我交换顺序,则A的ObjectFactory将保留下来。

问题在于,我需要两个ObjectFactories才能创建用于包装A和B Web服务类型的JAXBElements。

是否有一种方法可以将A的命名空间映射到Java包中,将B的命名空间映射到另一个包中,以便获得

com.mydomain.myapp.a
com.mydomain.myapp.b

那么如何同时保留两个ObjectFactories?

简单重构并不能解决问题,因为内部调用了getClass()方法,一旦包被重构,该方法就无法正常工作。

2个回答

3
这对我有用(使用Spring Java配置)
@Bean
public Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.example.api");
    return marshaller;
}

使用setPackagesToScan代替setContextPath对我来说起作用了(我认为它会忽略ObjectFactory中的内容并扫描整个包)。


2

好的!我使用了这个XML绑定:<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="" rel = "nofollow noreferrer">http://www.w3.org/2001/XMLSchema"> <jxb:bindings node="//xsd:schema[@targetNamespace='" rel = "nofollow noreferrer">http://mydomain.com/myapp/A']"> <jxb:package name="com.mydomain.myapp.a"> </jxb:package> </jxb:bindings> </jxb:bindings> 然而,它给了我XPath错误:null。我没有XSD文件,你有什么建议吗? - alexroat
2
刚有一个想法 - 你试过使用 "wsimport -p com.mydomain.myapp.a http:/mydomain/wsA.svc?wsdl" 和 "wsimport -p com.mydomain.myapp.b http:/mydomain/wsB.svc?wsdl" 吗?这将把所有生成的代码放入指定的包中(根据 "-p" 开关),而不需要绑定文件。(早些时候应该想到的...) - FOOM
是的,我做了。有很多错误,比如“两个声明在ObjectFactory类中发生冲突”,以及“具有相同名称“com.anthesi.prova.ExecuteTransmDocModelResponse”的类/接口已经在使用中。使用类自定义来解决此冲突。” - alexroat
好的,看起来很奇怪,你可能要确保你使用了不同的包等;但是继续往下说:我认为问题在于你的<jxb:bindings :/>元素中没有wsdlLocation。此外,请注意targetNameSpace应该是wsdl中的namespace,而不是你想要生成它的包。这里有一个相当不错的例子(在Java Bindings下查看):http://illegalargumentexception.blogspot.com/2011/04/java-jax-ws-web-services-and-clients.html#ws_bindings - FOOM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接