Exception in thread "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json Exception in thread "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json json json

Exception in thread "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json


You need to have the EclipseLink jars (2.4.0 or newer) on your class path, and a jaxb.properties file in the same package as the classes used to bootstrap theJAXBContext with the following entry:

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

Below is a link to an example on GitHub that you can run to see everything working:


To my main method I added (you could also use -D):

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


If you don't want to add a jaxb.properties file, you can do this all in Java code. This is especially helpful for legacy systems where you don't want to risk affecting the classpath by introducing a new jaxb.properties file.

import org.eclipse.persistence.jaxb.JAXBContextFactory;import org.eclipse.persistence.jaxb.JAXBContextProperties;import org.eclipse.persistence.jaxb.xmlmodel.ObjectFactory;//Set the various properties you wantMap<String, Object> properties = new HashMap<>();properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);//Create a Context using the propertiesJAXBContext jaxbContext =     JAXBContextFactory.createContext(new Class[]  {       MyClass.class,    ObjectFactory.class}, properties);Marshaller jaxbMarshaller = jaxbContext.createMarshaller();//Marshall the objectStringWriter stringWriter = new StringWriter();jaxbMarshaller.marshal(myObject, stringWriter);String json = stringWriter.toString();