[英]JAXB generating JAXBElement<String> instead of String
我正在使用Apache CXF
cxf-codegen-plugin
Maven
插件从WSDL
文件生成源代码。 问题是我生成了JAXBElement<String>
而不是String
。 我添加了jaxb-bindings.xml
文件,如下所示:
<jaxb:bindings version="2.1"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>
这应该可以防止JAXB
生成JAXBElement<String>
。 但它不起作用我仍然生成JAXBElement<String>
而不是String
。
我的Maven
插件如下所示:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.runtime.version}</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-bindings-soap</artifactId>
<version>${cxf.runtime.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-jaxb</id>
<phase>generate-sources</phase>
<configuration>
<additionalJvmArgs>-Dfile.encoding=UTF8</additionalJvmArgs>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/wsdl/Cubiks.wsdl</wsdl>
<extraargs>
<extraarg>-b</extraarg>
<extraarg>${basedir}/jaxb-bindings.xml</extraarg>
<extraarg>-b</extraarg>
<extraarg>${basedir}/jaxws-bindings.xml</extraarg>
<extraarg>-exsh</extraarg>
<extraarg>true</extraarg>
<extraarg>-wsdlLocation</extraarg>
<extraarg></extraarg>
</extraargs>
</wsdlOption>
<wsdlOption>
<wsdl>src/main/resources/wsdl/CubiksCallBackService.wsdl</wsdl>
<extraargs>
<extraarg>-b</extraarg>
<extraarg>${basedir}/jaxws-bindings.xml</extraarg>
<extraarg>-b</extraarg>
<extraarg>${basedir}/jaxb-bindings.xml</extraarg>
<extraarg>-exsh</extraarg>
<extraarg>true</extraarg>
<extraarg>-p</extraarg>
<extraarg>com.cubiks.ws.callback</extraarg>
<extraarg>-wsdlLocation</extraarg>
<extraarg></extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
CXF
版本是2.6.0
。 有人知道问题出在哪里吗?
编辑
XSD 非常庞大。 这是生成JAXBElement<String>
的元素
<xs:complexType name="ServiceResponse">
<xs:sequence>
<xs:element minOccurs="0" name="RequestStatus" type="tns:RequestStatus"/>
<xs:element minOccurs="0" name="RequestStatusDescription" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ServiceResponse" nillable="true" type="tns:ServiceResponse"/>
生成的源是:
@XmlElementRef(name = "RequestStatusDescription", namespace = "http://www.cubiksonline.com/2009/08/AssessmentProvider", type = JAXBElement.class)
protected JAXBElement<String> requestStatusDescription;
我必须做的是用另一个jaxb:bindings
包装jaxb:globalBindings
。
<jaxb:bindings version="2.0"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:bindings>
<jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>
</jaxb:bindings>
现在一切正常,不再生成JAXBElement<String>
。
你不能把 nillable 和 minoccurs 放在一起。 删除小事件,因为无论如何它对字符串没有意义。
我想你想在你的 jaxb-binding.xml 中添加:
<jaxb:bindings ... xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
<jaxb:globalBindings generateElementProperty="false">
<xjc:simple />
<!-- ... -->
</jaxb:globalBindings>
</jaxb:bindings>
我在资源文件夹中创建了一个名为bindings.xml
的文件,并添加了以下内容:
<?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>
然后我在 pom.xml 的 cxf 插件定义中提到了这个文件,如下所示:
在<wsdlOptions>
标签中,在<wsdlOption>
中它包含 wsdl 文件的路径,我添加了一个标签,其中包含:
<bindingFiles>
<bindingFile> ${basedir}/src/min/resources/bindings.xml </bindingFile>
</bindingFiles>
我的存根是用实际类型生成的。
当我们在 XSD 中同时具有minouucrs=0
和nillable=true
时,它将生成 JAXBElement。 为了避免这种情况,我们需要删除其中任何一个。
如果在从 XSD 方案生成 POJO 对象时使用generateElementProperty="false"
属性,那么它将像魅力一样工作
我的 wsdl 模式中有重复的元素,这就是 CXF 生成 JAXBElement 而不是字符串的原因。 当心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.