java json jaxb eclipselink moxy

Excepción en el hilo "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json



jaxb moxy (3)

Estoy intentando seguir el ejemplo que se encuentra here pero obtengo una excepción javax.xml.bind.PropertyException. Recibo esta excepción debido a la siguiente línea de código:

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

Literalmente, he copiado / pegado el ejemplo listado arriba, así que mi código es exactamente lo que ves allí. La búsqueda de SO y Google para esto no ha sido útil, y pensé que le llevaría esto a los genios de SO en busca de ayuda. Cualquier ayuda sería muy apreciada, la (des) serialización con JSON y XML con json.org, Jackson y JAXB se ha convertido en un pozo negro y sin fondo que ha consumido casi un mes de mi vida.

Mi primera impresión fue que no estaba especificando correctamente el tiempo de ejecución de eclipselink ( como se describe aquí ) pero eso no produjo una solución.

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)

Esto es lo que estoy haciendo,


A mi método principal agregué (también podrías usar -D ):

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


Si no desea agregar un archivo jaxb.properties, puede hacerlo todo en código Java. Esto es especialmente útil para los sistemas heredados en los que no desea arriesgarse de afectar la ruta de clase introduciendo un nuevo archivo 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();


jaxb.properties archivos EclipseLink (2.4.0 o más nuevos) en su ruta de clase y un archivo jaxb.properties en el mismo paquete que las clases utilizadas para arrancar el JAXBContext con la siguiente entrada:

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

A continuación hay un enlace a un ejemplo en GitHub que puede ejecutar para ver todo funcionando: