我继承了一个与基于 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>
现在我已经读到,为了让我所有的 Java 类都使用
@XmlRootElement
生成,我需要添加一个 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
?做这项工作需要这样做吗?
我认为您必须在此位置绑定 xsd 文件而不是 wsdl。
<jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">
。请参阅 link 上的“外部绑定自定义文件”部分。
不确定 JAXB 绑定是否配置正确。如果类构成元素结构的根,则需要 @XmlRootElement。但是在 SOAP 中,SOAP 元素将构成 XML 的根,因此请检查您的 ObjectFacory.java 类是否已生成,如果已生成,请验证是否为返回该类类型实例的类类型创建了一个方法,例如您有
class Foo
返回 Foo 实例的方法 `public Foo createFoo() 应该存在于您的 ObjectFoacory.java
但是我建议您使用 CXF 提供的 WSDL2java this 并启用客户端选项。配置客户端代码需要几分钟