web-dev-qa-db-fra.com

Exception dans le thread "main" javax.xml.bind.PropertyException: nom: eclipselink.media-type valeur: application / json

J'essaie de suivre l'exemple situé ici mais obtenez une exception javax.xml.bind.PropertyException. Je reçois cette exception en raison de la ligne de code suivante:

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

J'ai littéralement copié/collé l'exemple ci-dessus afin que mon code soit exactement ce que vous y voyez. La recherche de SO et Google pour cela n'a pas été utile, et j'ai pensé apporter cela aux génies à SO pour obtenir de l'aide. Toute aide serait la plus apprécié, la (dé) sérialisation avec JSON et XML avec json.org, Jackson et JAXB est devenue un gouffre noir et sans fond qui a consommé presque un mois de ma vie.

Ma première impression était que je ne spécifiais pas correctement le runtime eclipselink ( comme décrit ici ) mais cela n'a pas produit de solution.

Trace de la pile:

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)

C'est ce que je fais

enter image description here

18
user3167333

Vous devez avoir les fichiers JAR EclipseLink (2.4.0 ou plus récents) sur votre chemin de classe, et un jaxb.properties dans le même package que les classes utilisées pour bootstrap the JAXBContext avec l'entrée suivante:

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

Vous trouverez ci-dessous un lien vers un exemple sur GitHub que vous pouvez exécuter pour voir que tout fonctionne:

20
bdoughan

J'ai ajouté à ma méthode principale (vous pouvez également utiliser -D):

System.setProperty("javax.xml.bind.context.factory","org.Eclipse.persistence.jaxb.JAXBContextFactory");
10
weller1

Si vous ne souhaitez pas ajouter de fichier jaxb.properties, vous pouvez tout faire dans Java code. Ceci est particulièrement utile pour les systèmes hérités où vous ne voulez pas risquer d'affecter le chemin de classe en introduisant un nouveau fichier jaxb.properties.

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