web-dev-qa-db-ja.com

スレッド "main"の例外javax.xml.bind.PropertyException:名前:eclipselink.media-type値:application / json

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)

これは私がやっていることです、

enter image description here

18
user3167333

私が追加した主な方法に(-D):

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

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();
7
Jon