[Java] JAXB द्वारा उत्पन्न कोई @XmlRootElement नहीं


Answers

यह ऊपर से जुड़े ब्लॉग पोस्ट के निचले हिस्से में उल्लिखित है लेकिन यह मेरे लिए एक इलाज की तरह काम करता है:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(new JAXBElement<MyClass>(new QName("uri","local"), MyClass.class, myClassInstance), System.out);
Question

मैं एफपीएमएल (फिनानियल प्रोडक्ट्स मार्कअप लैंग्वेज) संस्करण 4.5 से जावा कक्षाएं उत्पन्न करने की कोशिश कर रहा हूं। कोड का एक टन उत्पन्न होता है, लेकिन मैं इसका उपयोग नहीं कर सकता। एक साधारण दस्तावेज़ को क्रमबद्ध करने का प्रयास करते हुए मुझे यह मिलता है:

javax.xml.bind.MarshalException
  - with linked exception: [com.sun.istack.SAXException2: unable
  to marshal type
  "org.fpml._2008.fpml_4_5.PositionReport"
  as an element because it is missing an
  @XmlRootElement annotation]

वास्तव में कोई कक्षा में @XmlRootElement एनोटेशन नहीं है, तो मैं गलत क्या कर सकता हूं? मैं xjc (JAXB 2.1) को fpml-main-4-5.xsd पर इंगित कर रहा हूं, जिसमें सभी प्रकार शामिल हैं।




क्या आपने इस तरह अपना एक्सएसडी बदलने की कोशिश की?

<!-- create-logical-system -->
<xs:element name="methodCall">
  <xs:complexType>
    ...
  </xs:complexType>
</xs:element>



JAXBElement wrappers उन मामलों के लिए काम करता है जहां JAXB द्वारा कोई @XmlRootElement उत्पन्न नहीं @XmlRootElement है। ये रैपर maven-jaxb2-plugin द्वारा उत्पन्न maven-jaxb2-plugin क्लास में उपलब्ध हैं। उदाहरण के लिए:

     public class HelloWorldEndpoint {
        @PayloadRoot(namespace = NAMESPACE_URI, localPart = "person")
        @ResponsePayload
        public JAXBElement<Greeting> sayHello(@RequestPayload JAXBElement<Person> request) {

        Person person = request.getValue();

        String greeting = "Hello " + person.getFirstName() + " " + person.getLastName() + "!";

        Greeting greet = new Greeting();
        greet.setGreeting(greeting);

        ObjectFactory factory = new ObjectFactory();
        JAXBElement<Greeting> response = factory.createGreeting(greet);
        return response;
      }
 }



Unmarshalling के लिए @XmlRootElement की आवश्यकता नहीं है - अगर कोई Unmarshaller # unmarshall के 2 पैरामीटर फॉर्म का उपयोग करता है।

तो, अगर करने के बजाय:

UserType user = (UserType) unmarshaller.unmarshal(new StringReader(responseString));

एक करना चाहिए:

JAXBElement<UserType> userElement = unmarshaller.unmarshal(someSource, UserType.class);
UserType user = userElement.getValue();

बाद वाले कोड को UserType क्लास स्तर पर @XmlRootElement एनोटेशन की आवश्यकता नहीं होगी।




यह हमारे लिए भी काम नहीं कर रहा है। लेकिन हमें व्यापक रूप से उद्धृत लेख मिला जो कुछ पृष्ठभूमि जोड़ता है ... मैं इसे अगले व्यक्ति के लिए यहां लिंक करूंगा: http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html




दो दिनों के लिए संघर्ष करने के बाद मुझे समस्या का समाधान मिला। आप ऑब्जेक्ट फैक्ट्री क्लास का उन वर्गों के लिए कामकाज का उपयोग कर सकते हैं जिनके पास @XmlRootElement नहीं है। ऑब्जेक्ट फैक्ट्री ने JAXBElement के चारों ओर लपेटने के तरीकों को अधिभारित किया है। विधि: 1 ऑब्जेक्ट और विधि का सरल निर्माण करता है : 2 ऑब्जेक्ट को @JAXBElement से लपेट देगा । हमेशा उपयोग करने के लिए विधि: 2 javax.xml.bind.MarshalException से बचने के लिए - लिंक किए गए अपवाद के साथ एक @XmlRootElement एनोटेशन गुम है

विधि: 1

public GetCountry createGetCountry() {
        return new GetCountry();
    }

विधि: 2

 @XmlElementDecl(namespace = "my/name/space", name = "getCountry")
 public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
        return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
    }

वर्किंग कोड नमूना:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
WebServiceTemplate springWSTemplate = context.getBean(WebServiceTemplate.class);

GetCountry request = new GetCountry();
request.setGuid("1f3e1771-3049-49f5-95e6-dc3732c3227b");

JAXBElement<GetCountryResponse> jaxbResponse = (JAXBElement<GetCountryResponse>)springWSTemplate .marshalSendAndReceive(new ObjectFactory().createGetCountry(request));

GetCountryResponse response = jaxbResponse.getValue();



एक्सएसडी में बेस प्रकारों के लिए @XmlRootElement क्लासेस कैसे उत्पन्न करें , इस से बाध्यकारी का उपयोग करके आप इस समस्या को ठीक कर सकते हैं ?

मेवेन के साथ एक उदाहरण यहां दिया गया है

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3.1</version>
            <executions>
                <execution>
                    <id>xjc</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>src/main/resources/xsd</schemaDirectory>
                <packageName>com.mycompany.schemas</packageName>
                <bindingFiles>bindings.xjb</bindingFiles>
                <extension>true</extension>
            </configuration>
        </plugin>

यहां binding.xjb फ़ाइल सामग्री है

<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="path/to/myschema.xsd" node="/xs:schema">
        <jxb:globalBindings>
            <xjc:simple/>
        </jxb:globalBindings>
    </jxb:bindings>
</jxb:bindings>