here にある例を実行しようとしていますが、javax.xml.bind.PropertyExceptionが発生します。次のコード行が原因でこの例外が発生します。
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
上記の例を文字通りコピー/貼り付けたので、私のコードは実際に表示されているとおりです。 SOとGoogleでこれを検索しても役に立たなかったため、SOで天才にこの情報を提供すると思います。 json.org、Jackson、およびJAXBを使用したJSONおよびXMLによる(逆)シリアライゼーションは、私の人生のほぼ1か月を費やした黒く底のない穴に変わりました。
私の第一印象は、eclipselinkランタイムを適切に指定していなかった( ここで説明したように )ことでしたが、それは解決策を生み出しませんでした。
スタックトレース:
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)
これは私がやっていることです、
私が追加した主な方法に(-D
):
System.setProperty("javax.xml.bind.context.factory","org.Eclipse.persistence.jaxb.JAXBContextFactory");
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();