我继承了一个与基于SOAP的Web服务进行通信的项目。虽然我已经做了很多年的Java并且已经用XML
做了很多工作,但我在这方面总是很棒。
我们有一个WSDL
服务文件,其中包含顶部的架构和下面的所有消息定义内容。在问题的核心,当我尝试通过我们的代码连接到服务时,我得到了可怕的无法编组类型“ https.api_blah_com.services.v4.Product ”作为元素,因为它缺少@XmlRootElement
注释]
我的项目已经有一个jaxws绑定文件:
<jaxws:bindings wsdlLocation="../resources/wsdl/BlahAPI.wsdl"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
<jaxws:bindings
node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='https:api.blah.com/services/v4']">
<jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xjc:generateElementProperty>true</xjc:generateElementProperty>
</jxb:globalBindings>`
</jaxws:bindings>
</jaxws:bindings>
现在我已经读过,为了获得用@XmlRootElement
生成的所有Java类,我需要添加jaxb:globalBinding
启用简单模式。
我已尝试添加到WSDL
这个本地副本:
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:simple />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
但JAXB
编译器抱怨它不能遵守这个globalBindings自定义,因为它附加到错误的地方或与其他绑定不一致。
所以我尝试添加另一个绑定文件,仅用于jaxb,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">
<jaxb:globalBindings>
<xjc:simple />
</jaxb:globalBindings>
</jaxb:bindings>
</jaxb:bindings>
但是后来我得到一个错误,blah.wsdl不是这个编译的一部分。
我非常接近这个服务......我只是无法理解这一件事,这对我来说都是新的,所以我不确定还有什么可以尝试。
我可以将WSDL
分成XSD
和WSDL
吗?是否需要这项工作?
答案 0 :(得分:0)
我认为你必须在这个位置绑定xsd文件而不是wsdl。 <jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">
。请参阅link上的“外部绑定自定义文件”部分。
答案 1 :(得分:0)
不确定JAXB Binding是否配置正确。如果类构成元素结构的根,则需要@XmlRootElement。但是在SOAP中,SOAP元素将形成XML的根,因此检查是否生成了ObjectFacory.java类,如果生成则验证是否为类类型创建了一个返回类类型实例的方法,例如你有{{ 1)一个方法`public Foo createFoo()返回Foo的实例应该出现在你的ObjectFoacory.java中
但是我建议您使用CXF提供的WSDL2java this并启用客户端选项。配置客户端代码需要几分钟时间