问题描述
我正在使用以下绑定文件运行 wsimport 任务:
I'm running a wsimport task with the following bindings file:
<jaxb:bindings version="2.1" xmlns:jaxb="http://www.51sjk.com/Upload/Articles/1/0/337/337515_20221130102518716.jpg" xmlns:xs="http://www.51sjk.com/Upload/Articles/1/0/337/337515_20221130102518977.jpg" > <jaxb:bindings> <jaxb:globalBindings generateElementProperty="false" typesafeEnumMaxMembers="2000" /> </jaxb:bindings> </jaxb:bindings>
但是,这会导致类具有 JAXBElement
However, this is resulting in classes with JAXBElement<String> instead of String as shown in the getUserSummaryOrTypeOrLogLevel() below
@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 文件中的条目如下:
The entry in the xsd file that this class is being generated from is below:
<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 插件
Here's the Maven plugin from my pom file
<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 有效,但是不是.
Can anyone shed some light on why this is happening? I want String to be used instead of JAXBElement<String> and anything I've found on SO and elsewhere suggests that generateElementProperty=false work but it isn't.
推荐答案
如果存在 xsd:choice 其中 foo 或 bar 元素可以出现并且它们是相同的类型.一个简单的字符串不足以标记应编组的元素.
The JAXBElement is mandatory if there is a xsd:choice where either foo or bar elements can occur and they are the same type. A simple String isn't enough to mark which element should be marshalled.
JAXBElement 如果有元素 nillable="true" 和 minOccurs="0" 或者如果有两个全局元素,也是必需的具有相同名称的 xsd:complexType.
JAXBElement is required also if there are element nillable="true" and minOccurs="0" or if there are two global elements with the same named xsd:complexType.