如何在CXF Web服务客户端中防止生成JAXBElement<String>?

50

我正在尝试使用CXF创建Web服务客户端来消费WCF Web服务。

当我使用wsdl2java时,它生成具有JAXBElement类型而不是String类型的对象。

我了解到可以使用jaxb bindings.xml文件设置generateElementProperty="false"来尝试解决这个问题,但是我要消费的Web服务包含7个导入的模式。

如何在所有七个模式上指定generateElementProperty="false",或者是否有一种方式可以将其应用于所有模式?

3个回答

73

您需要创建以下绑定文件,这将全局应用并将其用作 wsdl2java -b "bindings.txt" "wsdl"

<jaxb:bindings version="2.1" 
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:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

8
有关如何使用Maven插件设置绑定文件的说明,请参见:http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html。 - ScArcher2
1
最好使用更具体的文件扩展名来映射文件,例如建议使用.xml.xjb,如此处所提出的http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/2.0/tutorial/doc/JAXBUsing4.html#wp148366。 - schnatterer
1
如果您的XSD或WSDL中已经有了jaxb:globalBindings,只需在该节点上添加generateElementProperty="false"属性即可。在这种情况下无需添加另一个binding.xml文件。 - Alain Pannetier
@ScArcher2 太棒了,谢谢。我正在使用第三方WSDL,因此按照主答案中所示制作了此XML文件,并在pom.xml中定义它,就像链接中所示的那样。奏效了。 - Mital Pritmani
如果我使用这个绑定文件,发送和返回的数据会是空的。 - Panu Haaramo
创建动态客户端,请使用以下代码: JaxWsDynamicClientFactory.newInstance().createClient("wsdl", Arrays.asList("bindings.txt")) - Gat

0
请注意,在我的情况下,我必须在我的jaxb绑定文件中使用<xjc:simple来摆脱@Endpoint中的JAXBElement请求和响应包装器:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" elementFormDefault="qualified" attributeFormDefault="unqualified" jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1">
    <xs:annotation>
        <xs:appinfo>
            <jaxb:globalBindings>
                <xjc:simple /><!-- it did only work after adding this -->
            </jaxb:globalBindings>
        </xs:appinfo>
    </xs:annotation>
</xs:schema>

0
如果我们正在使用与Jakarta EE兼容的CXF版本,则应更改语法为:
<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:jaxws="https://jakarta.ee/xml/ns/jaxws"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <jxb:globalBindings generateElementProperty="false"/>
</jaxws:bindings>

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