JAXB: невозможно демаршалировать JAXBElement, вместо этого получить ElementNSImplJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 JAXB: невозможно демаршалировать JAXBElement, вместо этого получить ElementNSImpl

Сообщение Anonymous »

Что касается JAXB: как реализовать класс-оболочку варианта, совместимого с JAXB? Я пытался использовать JAXBElement для представления «варианта» или «любого типа».

Маршалинг прошел нормально, но во время демаршаллинга JAXB пытается присвоить ElementNSImpl полю JAXBElement.

Тестовый код

(копировать+вставить+запустить)

import static java.lang.System.*;
import java.io.*;
import java.util.*;

import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.*;

import org.junit.*;

public class _JaxbElementProblem {

@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();

@SuppressWarnings("unused")
private MyObject() {
}

public MyObject(Object o) {
single = new JAXBElement(VARIANT_NAME, Object.class, o);
}

public Object getSingle() {
return single.getValue();
}

public List getElements() {
List ret = new LinkedList();

for (JAXBElement e : elements) {
ret.add(e.getValue());
}

return ret;
}

@Override
public String toString() {
return "MyObject (single=" + single.getValue() + "; elements: "
+ getElements() + ")";
}

}

private static final JAXBContext C;
private static final Marshaller M;
private static final Unmarshaller U;

static {
try {
C = JAXBContext.newInstance(MyObject.class);

M = C.createMarshaller();
U = C.createUnmarshaller();

M.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
} catch (JAXBException ex) {
throw new Error(ex);
}
}

private void testMarshalUnmarshal(Object root) throws Exception {
out.println("\nMARSHALLED - - - - - - - - - - - - - - - - - - - -");
StringWriter sw = new StringWriter();
M.marshal(root, sw);
out.println(sw.toString() + "\n");

out.println("\nUNMARSHALLED - - - - - - - - - - - - - - - - - - - -");
Object reunmarshalled = U.unmarshal(new StringReader(sw.toString()));
out.println(reunmarshalled + "\n");
}

@Before
public void before() {
out.println("\n= = = = = = = = = = = = = = = = = = = =");
}

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

test output < /h2>

(как вы можете видеть, Unmarshalling не происходит) < / / сильный>

= = = = = = = = = = = = = = = = = = = =

MARSHALLED - - - - - - - - - - - - - - - - - - - -


12345



UNMARSHALLED - - - - - - - - - - - - - - - - - - - -

= = = = = = = = = = = = = = = = = = = =

MARSHALLED - - - - - - - - - - - - - - - - - - - -



12345





UNMARSHALLED - - - - - - - - - - - - - - - - - - - -

= = = = = = = = = = = = = = = = = = = =

MARSHALLED - - - - - - - - - - - - - - - - - - - -



12345




sub-1



sub-2



sub-3





UNMARSHALLED - - - - - - - - - - - - - - - - - - - -


Демаршаллинг исключений

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)


Подробнее здесь: https://stackoverflow.com/questions/677 ... pl-instead
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»