2014-01-07 4 views
16

Ich versuche, das Beispiel here zu folgen, aber eine javax.xml.bind.PropertyException zu erhalten. Ich erhalte diese Ausnahme wegen der folgenden Codezeile:Ausnahme im Thread "Haupt" javax.xml.bind.PropertyException: name: eclipselink.media-typ Wert: application/json

marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 

Ich habe buchstäblich/eingefügt Kopie das Beispiel meinen Code oben aufgeführt, so ist genau das, was Sie dort sehen. Nach SO und Google zu suchen, war nicht hilfreich, und ich dachte, ich würde dies den Genies in SO für etwas Hilfe bringen. Jede Hilfe würde sehr geschätzt werden, (de) Serialisierung mit JSON und XML mit json.org, Jackson und JAXB hat sich in eine schwarze und bodenlose Grube verwandelt, die fast einen Monat meines Lebens verschlungen hat.

Mein erster Eindruck war, dass ich die Eclipselink Runtime nicht richtig angegeben habe (as described here), aber das hat keine Lösung erzeugt.

Stacktrace:

Exception in thread "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json 
    at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358) 
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527) 
    at HelloWorld.main(HelloWorld.java:17) 

Das ist, was ich tue,

enter image description here

+1

verwenden Sie EclipseLink 2.4.0 oder höher? – sasankad

+1

@sasankad - Guter Fang. Die Ausnahme, die ausgelöst wird, ist eine RI-Ausnahme (Paket 'com.sun.xml.internal.bind.v2.runtime '), daher wird EclipseLink MOXy nicht als JAXB-Anbieter ausgewählt. –

+1

@BlaiseDoughan, Ziemlich einige Leute sind auf dieses Problem gestoßen – sasankad

Antwort

18

Sie müssen die Eclipse Gläser (2.4.0 oder höher) haben auf Ihrem Klassenpfad, und eine jaxb.properties Datei in demselben Paket wie die Klassen, die verwendet werden, um die JAXBContext mit dem folgenden Eintrag zu laden:

Unten ist ein Link zu einem Beispiel auf GitHub, dass Sie ausführen können, um zu sehen, alles funktioniert:

+0

Danke für die Antwort! Hast du meine PrintScr gesehen? Ich habe den letzten EclipseLink heruntergeladen und die Datei jaxb.properties erstellt. Was könnte es falsch sein? – user3167333

+1

Ich habe es schon repariert! Es war ein Problem mit Jaxb. Vielen Dank! – user3167333

+0

Bitte erläutern Sie das Problem mit Jaxb. – atripes

7

Zu meiner Haupt-Methode, die ich hinzugefügt (Sie können auch -D verwenden könnten):

System.setProperty("javax.xml.bind.context.factory","org.eclipse.persistence.jaxb.JAXBContextFactory"); 
+3

Willkommen bei SO. Bitte formatieren Sie den Code in Ihrer Antwort und überlegen Sie, warum Ihre Antwort funktioniert. Schlagen Sie auch in der [Anleitung zum Beantworten] (http://stackoverflow.com/help/how-to-answer) nach. –

6

Wenn Sie keine jaxb.properties-Datei hinzufügen möchten, können Sie dies alles in Java-Code tun. Dies ist besonders hilfreich für Legacy-Systeme, in denen Sie nicht riskieren möchten, den Klassenpfad zu beeinflussen, indem Sie eine neue Datei jaxb.properties einleiten.

import org.eclipse.persistence.jaxb.JAXBContextFactory; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 
import org.eclipse.persistence.jaxb.xmlmodel.ObjectFactory; 

//Set the various properties you want 
Map<String, Object> properties = new HashMap<>(); 
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); 
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); 

//Create a Context using the properties 
JAXBContext jaxbContext = 
    JAXBContextFactory.createContext(new Class[] { 
     MyClass.class, ObjectFactory.class}, properties); 
Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

//Marshall the object 
StringWriter stringWriter = new StringWriter(); 
jaxbMarshaller.marshal(myObject, stringWriter); 
String json = stringWriter.toString();