Bezogen auf JAXB: So implementieren Sie eine JAXB-kompatible Varianten-Wrapper-Klasse? Feld.[code]import static java.lang.System.*; import java.io.*; import java.util.*;
@XmlRootElement @XmlType @XmlAccessorType(XmlAccessType.NONE) static class MyObject {
public static final QName VARIANT_NAME = new QName("QQQ");
@XmlAnyElement(lax = true) private JAXBElement single = null; @XmlElementWrapper(name = "elements") @XmlAnyElement(lax = true) final List elements = new LinkedList();
@Test public void test1() throws Exception { MyObject root = new MyObject(Integer.valueOf(12345)); testMarshalUnmarshal(root); }
@Test public void test2() throws Exception { MyObject sub = new MyObject(Integer.valueOf(12345)); MyObject root = new MyObject(sub); testMarshalUnmarshal(root); }
@Test public void test3() throws Exception { MyObject oSub = new MyObject(Integer.valueOf(12345)); List oSubs = Arrays.asList(new MyObject("sub-1"), new MyObject("sub-2"), new MyObject("sub-3"));
MyObject root = new MyObject(oSub); for (MyObject o : oSubs) { root.elements.add(new JAXBElement(MyObject.VARIANT_NAME, Object.class, o)); }
testMarshalUnmarshal(root); } } < /code>
Testausgabe < /h2>
(Wie Sie sehen können, findet nicht statt) < /strong> < /p>
java.lang.IllegalArgumentException: Can not set javax.xml.bind.JAXBElement field my._JaxbElementProblem$MyObject.single to com.sun.org.apache.xerces.internal.dom.ElementNSImpl at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) at java.lang.reflect.Field.set(Field.java:657) at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$FieldReflection.set(Accessor.java:234) at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.receive(Accessor.java:160) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:507) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:145) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194) at my._JaxbElementProblem.testMarshalUnmarshal(_JaxbElementProblem.java:84) at my._JaxbElementProblem.test3(_JaxbElementProblem.java:119) [/code]
Ich muss eine davon erstellen, da die Schnittstelle dies erfordert. Kann mir bitte jemand wissen lassen, wie man einen erstellt, da es keinen definierten Konstruktor gibt?