我正在使用以下绑定文件运行wsimport任务:
<jaxb:bindings version="2.1"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<jaxb:bindings>
<jaxb:globalBindings generateElementProperty="false" typesafeEnumMaxMembers="2000" />
</jaxb:bindings>
</jaxb:bindings>
但是,这会产生JAXBElement<String>
而不是String
的课程,如下面getUserSummaryOrTypeOrLogLevel()
所示
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ConfigSLMAction", propOrder = {
"userSummaryOrTypeOrLogLevel"
})
public class ConfigSLMAction
extends ConfigConfigBase
{
@XmlElementRefs({
@XmlElementRef(name = "UserSummary", type = JAXBElement.class, required = false),
@XmlElementRef(name = "LogLevel", type = JAXBElement.class, required = false),
@XmlElementRef(name = "Type", type = JAXBElement.class, required = false)
})
protected List<JAXBElement<String>> userSummaryOrTypeOrLogLevel;
@XmlAttribute(name = "name")
protected String name;
@XmlAttribute(name = "local")
protected Boolean local;
@XmlAttribute(name = "intrinsic")
protected Boolean intrinsic;
@XmlAttribute(name = "read-only")
protected Boolean readOnly;
@XmlAttribute(name = "external")
protected Boolean external;
/**
* Gets the value of the userSummaryOrTypeOrLogLevel property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the userSummaryOrTypeOrLogLevel property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getUserSummaryOrTypeOrLogLevel().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
*
*
*/
public List<JAXBElement<String>> getUserSummaryOrTypeOrLogLevel() {
if (userSummaryOrTypeOrLogLevel == null) {
userSummaryOrTypeOrLogLevel = new ArrayList<JAXBElement<String>>();
}
return this.userSummaryOrTypeOrLogLevel;
}
...
...
...
}
xsd文件中生成此类的条目如下:
<xsd:complexType name="ConfigSLMAction">
<xsd:complexContent>
<xsd:extension base="tns:ConfigConfigBase">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="UserSummary" minOccurs="0" maxOccurs="1">
<xsd:simpleType>
<xsd:union memberTypes="tns:dmString tns:dmEmptyElement" />
</xsd:simpleType>
</xsd:element>
<xsd:element name="Type" minOccurs="1" maxOccurs="1">
<xsd:simpleType>
<xsd:union memberTypes="tns:dmSLMActionType tns:dmEmptyElement" />
</xsd:simpleType>
</xsd:element>
<xsd:element name="LogLevel" minOccurs="0" maxOccurs="1">
<xsd:simpleType>
<xsd:union memberTypes="tns:dmLogLevel tns:dmEmptyElement" />
</xsd:simpleType>
</xsd:element>
</xsd:choice>
<xsd:attributeGroup ref="tns:ConfigAttributes" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
这是我的pom文件中的Maven插件
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>wsimport-from-jdk</id>
<phase>generate-sources</phase>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<wsdlFiles>
<wsdlFile>${basedir}/src/main/resources/wsdl/xml-mgmt.wsdl</wsdlFile>
</wsdlFiles>
<bindingFiles>
<bindingFile>${basedir}/src/main/resources/wsdl/bindings.xml</bindingFile>
</bindingFiles>
<keep>true</keep>
<verbose>true</verbose>
<extension>true</extension>
<vmArgs>
<vmArg>-Djavax.xml.accessExternalDTD=all</vmArg>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
</configuration>
</plugin>
有人能说清楚为什么会这样吗?
我希望String
代替JAXBElement<String>
,而我在SO和其他地方找到的任何内容都表明generateElementProperty=false
有效,但事实并非如此。
答案 0 :(得分:8)
JAXBElement
是强制性的,如果xsd:choice
可能会出现foo
或bar
元素并且它们属于同一类型。
一个简单的String不足以标记应该编组哪个元素。
JAXBElement
和nillable="true"
,或者有两个全局元素具有相同的名称minOccurs="0"
,则还需要 xsd:complexType
。
答案 1 :(得分:1)
你可以试试另一个插件来确保JAXB中有错误吗?在我们的项目中,我们正在使用:
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<executions>
<execution>
<id>generate-sources-ais</id>
<phase>generate-sources</phase>
<configuration>
<defaultOptions>
<bindingFiles>
<bindingFile>${basedir}/src/main/resources/wsdl/binding/bindings.xml</bindingFile>
</bindingFiles>
</defaultOptions>
<sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
<wsdlRoot>${basedir}/src/main/resources/wsdl</wsdlRoot>
<includes>
<include>**/*.wsdl</include>
</includes>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
它可以正常运行
更新:
你是对的插件还可以。这是因为选择元素。可能与this
重复