Исключение в потоке "main" javax.xml.bind.PropertyException: name: eclipselink.media-type value: application/json

Я пытаюсь следовать примеру здесь, но получаю исключение javax.xml.bind.PropertyException. Я получаю это исключение из-за следующей строки кода:

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

Я буквально копировал/вставлял приведенный выше пример, поэтому мой код именно то, что вы там видите. Поиск SO и Google для этого не помог, и я подумал, что я приведу это гениям в SO для некоторой помощи. Любая помощь была бы наиболее оценена, (де) сериализация с JSON и XML с json.org, Jackson и JAXB превратилась в черную и бездонную яму, которая поглотила почти месяц моей жизни.

Мое первое впечатление заключалось в том, что я не правильно указывал время выполнения eclipselink (как описано здесь), но это не создало решение.

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)

Это то, что я делаю,

enter image description here

Ответы

Ответ 1

Вам нужно иметь банки EclipseLink (2.4.0 или новее) в вашем пути к классу и файл jaxb.properties в том же пакете, что и классы, используемые для начальной загрузки JAXBContext со следующей записью:

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

Ниже приведена ссылка на пример GitHub, который вы можете запустить, чтобы увидеть все, что работает:

Ответ 2

К моему основному методу я добавил (вы также можете использовать -D):

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

Ответ 3

Если вы не хотите добавлять файл jaxb.properties, вы можете сделать это все в Java-коде. Это особенно полезно для устаревших систем, где вы не хотите рисковать воздействовать на путь класса, введя новый файл 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();