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: