2014-04-03 9 views
6

Ich folgte diesem Beispiel: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JSON_Twittermoxy JAXB javax.xml.bind.PropertyException

Jetzt habe ich diese Klasse:

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); 
    } 
} 

Und ich habe jaxb.properties:

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

Wenn ich laufen diesen Code erhalte ich:

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) 

Wie kann ich das beheben?

Ich suchte SO und Google, diese Antworten funktionieren nicht:

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

Antwort

9

Sie brauchen, um sicherzustellen, dass Ihre jaxb.properties-Datei im selben Paket wie die Domain-Klassen ist es, Ihnen Bootstrap verwendet die JAXBContext, und das EclipseLink MOXy ist auf Ihrem Klassenpfad.

Wenn Sie Maven verwenden, dann die jaxb.properties Datei sollte unter der folgenden Position sein unter der Annahme Foo in einem Paket com.example.Foo genannt ist:

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

Ein vollständiges Beispiel finden Sie unter:

+0

Dank. Das hat mein Problem gelöst. Ich habe eine andere Frage, bitte helfen Sie mir. Ich habe einen REST Jersey (2.7) -Server, der MOXy benutzt, weil ich Entity-Filter brauche. Ich möchte einen REST-Client auf Android machen. Ich habe versucht JBoss RESTEasy-mobile, die für eine Weile gut war, aber das verwendet Jackson, und MOXy und Jackson Konflikte MAP . So, jetzt möchte ich MOXy auf Android verwenden, aber es sieht, ich kann nicht. Kann ich? Wie kann ich das lösen? –

+0

danke für den Hinweis mit der Paketstruktur, viel besser als sie im Quellordner zu platzieren! –

+1

Sie müssen die Datei jaxb.properties in derselben Datei-/Paketstruktur wie das _model_ und nicht im Marshaller-Code platzieren. In diesem Beispiel ist "Foo" das Modell, nicht der Name der Marshaller-Demo. Das Ausführen von 'System.out.println (jaxbContext);' hilft beim Debuggen (wie in der Blog-Demo). Wenn Sie das ausführen und "class org.eclipse.persistence.jaxb.JAXBContext" nicht sehen, laden Sie nicht den richtigen 'JAXBContext'. –