osgi環境(Liferay DXP)でJAXB 2.2.11を使用しようとしています。 JAXBContextの作成に問題があります。 thisとthisのような研究中に発見されたいくつかの他のソースに基づいて、私はosgiコンテナで、JAXBがコンテキストをインスタンス化するための正しいクラスローダを提供する必要があると判断しました。私はcontext
がヌルでなければならないことがわかりますosgi(Liferay DXP)でJAXB 2.2.11を使用する方法
Caused by: java.lang.NullPointerException
at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:129)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:201)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:371)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:446)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:409)
ContextFinderのソースを見てみると:
ClassLoader cl package.with.jaxb.objects.ObjectFactory.class.getClassLoader(); JAXBContext jc = JAXBContext.newInstance("package.with.jaxb.objects ", cl);
このコードは、次のスタックトレースとnullポインタ例外が発生します。だから私は、このようなコードを持っていますライン129上:
throw handleClassCastException(context.getClass(), JAXBContext.class);
私はperhap思いました問題は私のモジュールがjaxb-api 2.2.11に依存していたことですが、jaxb-implクラスは実行時にrt.jarによって提供され、Liferay DXPがJDK 1.8上で動作するため、おそらく2.2.11より新しいです。この問題を回避するために、jaxb-impl.jar 2.2.11をosgiモジュールの依存関係として含めてみました。jaxb-api & jaxb-implバージョンが一致すると考えています。その後、次のエラーが発生し、上記と同じコードを使用してJAXBContentを作成しようとしている:このメッセージのルックスによって
ClassCastException: attempting to cast jar:file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class to bundleresource://623.fwk616113009:13/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
、インスタンス化取得されたJAXBContextを経由してロードされたJAXBContextのバージョンからですrt.jar。私のモジュールにjaxb-impl.jarを組み込んで使用したので、私のモジュールのクラスローダーによってロードされたJAXBContextのバージョンが期待され、私のモジュールのクラスローダーを指定しましたので、これは私にとって非常に混乱しています。 JAXBContext.newInstanceへの私の呼び出し。誰かがjaxb 2.2.11をosgiコンテナで動作させる方法についていくつかの光を当てることができますか?
* JAXBコードは実際にjaxb 2.2.11を必要とするサードパーティ製のジャーにあるため、私のモジュールで使用されているjaxb-apiのバージョンをアップグレードできませんのでご注意ください。(サードパーティのジャーをテストJAXBコードを書くことによって、今の方程式です)。
Grzegorzさんにお返事ありがとうございます。残念ながら、私の記事の最後で述べたように、JAXBコードはサードパーティのライブラリにあるので、実際にはどのように記述されているのかはわかりません.STIX(https://github.com/STIXProject/java) -stix)、STIX libはjaxb-apiを使用しています。 – clav