2013-02-15 10 views
5

Próbuję adnotować klasy java, aby utworzyć schemat JAXB z elementem, który ma atrybut wartości. Kod jest poniżej:Atrybut JAXB z wyjątkiem wyrzucania wskaźnika pustego obiektu typu Object Object?

@XmlAttribute(name="value") 
    public Object getSettingValue() { 
     return this.settingValue; 
    } 

    public void setSettingValue(final Object settingValue) { 
     this.settingValue = settingValue; 
    } 

Kiedy próbuję wygenerować schemat (przy użyciu non-Moxy realizację Eclipse), otrzymuję ten wskaźnik NULL wyjątek:

Exception in thread "main" java.lang.NullPointerException 
    at com.sun.xml.internal.bind.v2.runtime.reflect.TransducedAccessor.get(TransducedAccessor.java:154) 
    at com.sun.xml.internal.bind.v2.runtime.property.AttributeProperty.<init>(AttributeProperty.java:56) 
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:93) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:145) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:479) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:305) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:376) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.buildJaxbContext(Main.java:95) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.generate(Main.java:76) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.execute(Main.java:62) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.main(Main.java:47) 

Kiedy zrobiłem to za @XmlElement zamiast atrybutu schemat został wygenerowany bez problemów, więc musi z tym mieć do czynienia. Jakieś pomysły?

+0

Czy własność musi być typu 'Obiekt' lub czy można go zmienić na' String'? –

+0

@BlaiseDoughan Będziemy przekazywać obiekty różnych typów - Integer, Boolean lub String (i być może inne typy w miarę rozszerzania naszej aplikacji). Nie wiem, czy moglibyśmy zmienić to na String. Moglibyśmy stworzyć oddzielny program ustawiający, który pobierałby String. – chama

+1

@BlaiseDoughan Udało mi się zmienić go na ciąg, a następnie przepuścić go przez moją prawdziwą metodę. Dzięki! – chama

Odpowiedz

3

NullPointerException jesteś pojawi widząc się z powodu błędu w implementacji referencyjnej JAXB. Możesz wprowadzić błąd za pomocą poniższego linku.

Podobny wyjątek nie przy użyciu EclipseLink JAXB (MOXy) jako dostawcę JAXB wystąpić.

Obejście

Można zmienić właściwość być typu String zamiast. Właściwość typu Object ani przez cały czas nie podróżowałaby w obie strony, ponieważ w przeciwieństwie do elementów, atrybuty nie mają żadnych mechanizmów, które uwzględniałyby wpisywanie informacji.


Kiedy zrobiłem to za @XmlElement zamiast atrybutem, schemat została wygenerowana bez żadnych problemów, więc musi mieć do czynienia z tym.

Java model (korzeń)

Obiekt jest ważny rodzaj nieruchomości, gdy odwzorowany do elementu XML.

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Root { 

    private Object settingValue; 

    public Object getSettingValue() { 
     return settingValue; 
    } 

    public void setSettingValue(final Object settingValue) { 
     this.settingValue = settingValue; 
    } 

} 

To dlatego, że element XML może zawierać wpisując informacje w postaci atrybutu xsi:type.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <settingValue 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xsi:type="xs:int">123</settingValue> 
</root> 
+0

Przepraszamy, ale nie sądzę, że to błąd. Atrybuty Xml nie mogą mieć typów złożonych. Zobacz moją odpowiedź. – Puce

+0

@Puce - 'String',' Integer', 'Date' to wszystkie instancje' Object', które nie odpowiadają typom złożonym w XML i mogą być reprezentowane jako atrybuty w XML. W każdym razie jest to błąd, który jest generowany przez NPE zamiast lepszego wyjątku. –

+0

Cóż, NPE nie jest ładne, zgadzam się, ale atrybuty mogą mieć tylko typy, które są odwzorowane albo na typy wbudowane, np. Ciąg, liczba całkowita, data lub typy mapujące do typów prostych. Ale nie złożone typy. Dzieje się tak dlatego, że XML/XSD dopuszcza tylko typy wbudowane i typy proste dla atrybutów. – Puce

1

Typy atrybutów muszą być odwzorowane na wbudowane typy danych schematu lub na typy proste schematu.

Typ Obiekt nie spełnia tych kryteriów.

http://www.w3schools.com/schema/el_attribute.asp

http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlAttribute.html

+0

To, co mówisz, to że XmlAttriubte może być dowolnym typem, o ile ten typ można odwzorować na Xml (używając JAXB), ale obiekt nie może zostać odwzorowany? – chama

+0

Nie próbowałem go szczegółowo, ale jak rozumiem, można użyć typów mapujących do wbudowania w typy takie jak int, boolean, BigInteger, data/czas/dataTime itp. Lub typ z pojedynczą propterty, który jest opatrzony komentarzem z @XmlValue: http://fusesource.com/docs/esb/4.2/jaxws/JAXWSCustomTypeMappingSimple.html – Puce

Powiązane problemy