2014-04-03 12 views
6

Śledziłem ten przykład: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JSON_TwitterMoxy JAXB javax.xml.bind.PropertyException

Teraz mam tej klasy:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.transform.stream.StreamSource; 

import org.eclipse.persistence.jaxb.MarshallerProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setProperty("eclipselink.media-type", "application/json"); 
     unmarshaller.setProperty("eclipselink.json.include-root", false); 
     StreamSource source = new StreamSource("http://test.url/path/to/resource"); 
     JAXBElement<Foo> jaxbElement = unmarshaller.unmarshal(source, Foo.class); 

     System.out.println(jaxbElement.getValue().getFoo()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 
     marshaller.setProperty("eclipselink.json.include-root", false); 
     marshaller.marshal(jaxbElement, System.out); 
    } 
} 

I mam jaxb.properties:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Jeśli biegnę ten kod, otrzymuję:

Exception in thread "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.setProperty(AbstractUnmarshallerImpl.java:352) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.setProperty(UnmarshallerImpl.java:450) 
    at com.example.JavaSEClient.main(JavaSEClient.java:19) 

Jak mogę to naprawić?

Szukałem SO i Google, odpowiedzi te nie działają:

PropertyException when setting Marshaller property with eclipselink.media-type value: application/json JAXB javax.xml.bind.PropertyException

Odpowiedz

9

Musisz upewnić się, że plik jaxb.properties jest w tym samym opakowaniu co klasach domeny użyta do bootstrap JAXBContext i że EclipseLink MOXy znajduje się na ścieżce twojej klasy.

Jeśli używasz Maven, to plik jaxb.properties powinny być pod następującym miejscu zakładając Foo jest w pakiecie o nazwie com.example.Foo:

  • src/main/resources/com/example/foo/jaxb.properties
  • src/main/java/com/example/foo/Foo.class

Aby uzyskać pełną przykład patrz:

+0

Dzięki. To rozwiązało mój problem. Mam kolejne pytanie, proszę o pomoc. Mam serwer REST Jersey (2.7), który używa MOXy, ponieważ potrzebuję filtrów jednostek. Chcę zrobić klienta REST na Androidzie. Próbowałem JBoss RESTEasy-mobile, który działał przez jakiś czas, ale używa Jackson i konfliktów MOXy i Jackson MAP . Więc teraz chcę używać MOXy na Androidzie, ale wygląda na to, że nie mogę. Czy mogę? Jak mogę to rozwiązać? –

+0

dziękuję za podpowiedź ze strukturą paczki, znacznie lepiej niż umieszczenie ich w folderze źródłowym! –

+1

Należy umieścić właściwość jaxb.properties w tej samej strukturze pliku/pakietu, co kod_model_, a nie w kodzie źródłowym. W tym przykładzie 'Foo' jest modelem, a nie nazwą demo marshaller. Uruchamianie 'System.out.println (jaxbContext);' naprawdę pomaga w debugowaniu (podobnie jak w demo bloga). Jeśli uruchomisz to i nie zobaczysz 'class org.eclipse.persistence.jaxb.JAXBContext', nie ładujesz poprawnego' JAXBContext'. –