2015-07-10 4 views
8

मैं निम्नलिखित बाइंडिंग के साथ एक 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> 

यहां मेरी पोम फ़ाइल से मेवेन प्लगइन है

<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> 

क्या कोई ऐसा क्यों हो रहा है पर कुछ प्रकाश डाल सकता है? मुझे StringJAXBElement<String> के बजाय उपयोग किया जाना चाहिए और एसओ और अन्य जगहों पर जो कुछ भी मिला है, वह बताता है कि generateElementProperty=false काम करता है लेकिन यह नहीं है।

+0

ठीक है मुझे इसी तरह का प्रश्न मिला: http://stackoverflow.com/questions/22513736/jaxb-avoid-jaxbelement और समस्या विकल्प तत्व के साथ है। – hudi

उत्तर

8

अगर वहाँ एक xsd:choice जहां या तो foo या bar तत्वों हो सकता है और वे एक ही प्रकार के हैं JAXBElement अनिवार्य है के साथ दोहराया। एक साधारण स्ट्रिंग यह चिह्नित करने के लिए पर्याप्त नहीं है कि कौन सा तत्व मार्शल किया जाना चाहिए।

JAXBElement भी आवश्यक है तत्व nillable="true" और minOccurs="0" देखते हैं या यदि अगर वहाँ एक ही xsd:complexType नामित के साथ दो वैश्विक तत्व हैं।

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

+0

को 'JAXBElement ' के साथ एक ही आउटपुट मिला, लेकिन मैं ' -xjc-Xinheritance' का उपयोग नहीं कर सका क्योंकि प्लगइन ने एक त्रुटि फेंक दी – conorgriffin

+0

आह क्षमा करें, आप इस तर्क को याद कर सकते हैं। जब आप binding.xml में उत्तराधिकारी का उपयोग करते हैं तो आपको इसकी आवश्यकता होती है और फिर आपको एक और निर्भरता की आवश्यकता होती है। मैं एक्सएमएल – hudi

+0

अपडेट करूंगा, मैंने वैसे भी तर्क छोड़ दिया है, फिर भी जब मैं 'jaxws-maven-plugin' – conorgriffin

संबंधित मुद्दे