Web Services 如何指定jaxws和jaxb绑定以实现@XmlRootElement

t30tvxxf  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(111)

我继承了一个与基于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拆分为XSDWSDL?这是工作所必需的吗?

ct3nt3jp

ct3nt3jp1#

我认为您必须在此位置绑定xsd文件而不是wsdl。<jaxb:bindings schemaLocation="../resources/wsdl/blah.wsdl">。请参阅link处的“外部绑定自定义文件”一节。

ctzwtxfj

ctzwtxfj2#

不确定是否正确配置了JAXB绑定。如果类构成元素结构的根,则需要@XmlRootElement。但是在SOAP中,SOAP元素将构成XML的根,因此请检查是否生成了ObjectFacory.java类,如果生成了,验证是否为返回类类型示例的类类型创建了一个方法,例如,您有class Foo一个方法'返回Foo示例的公共Foo createFoo()应存在于www.example.com中ObjectFoacory.java
但是我建议您使用CXF提供的WSDL 2 javax 1 e0f1x并启用客户端选项。

相关问题