我继承了一个与基于 SOAP 的 Web 服务通信的项目。我在这方面完全是个菜鸟,虽然我已经做了很多年 Java 并且在 XML
方面做得很好。 .
我们有一个 WSDL
服务的文件,其中包含顶部的架构和下面的所有消息定义内容。问题的核心是,当我尝试通过我们的代码连接到服务时,我得到了可怕的无法编码类型“https.api_blah_com.services.v4.Product”作为元素,因为它缺少 @XmlRootElement
。注解]
我的项目已经有一个 jaxws 绑定(bind)文件:
<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 自定义,因为它附加到错误的位置或与其他绑定(bind)不一致。所以我尝试为 jaxb 添加另一个绑定(bind)文件,如下所示:
<?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
?这是完成这项工作所必需的吗?
最佳答案
我认为您必须在此位置绑定(bind) xsd 文件而不是 wsdl。 <jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">
.请引用 link 上的“外部绑定(bind)自定义文件”部分.
关于web-services - 如何同时指定 jaxws 和 jaxb 绑定(bind)以实现@XmlRootElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19597642/