marhsal Javaオブジェクトを文字列にしようとすると、クラスキャスト例外が発生します。 libフォルダにJAXB-2.1 jarを含めました。 WASにデプロイする際には、クラスローダー戦略を親に最後に変更して、ローカルライブラリのjarファイルを最初に取得するようにしました。しかし、これはまだ以下のメッセージでクラスキャストの例外を投げています。このエラーの原因は何ですか?JAXBを使用したClassCastException - Websphere jarとapplicationl jar
javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/opt/was7/base/crm/java/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class to wsjar:file:/prod/wesadm/wes/was7/base/profiles/sadasd/installedApps/asdadad/myapp.ear/myapp_war.war/WEB-INF/lib/jaxb-api-2.1.jar!/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:96)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:214)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:372)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
at com.my.MyClass.convertObjectToXML()
これはconvertObjectToXML()方法です。
private <T> String convertObjectToXMLString(T obj) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.marshal(obj, sw);
return sw.toString();
}
このロジックは、Tomcatにデプロイすると正常に動作します。私は、クラスローダーを親として最後に言及したにもかかわらず、WAS jarファイルが選択されている理由を理解することができません。
あなたのサーバーでポリシーをチェックしましたか?ポリシーが単一の場合、ポリシーが複数の場合は各アプリケーションが独自のモードを持つ、サーバーレベルのモードがすべてのアプリケーションで強制されますhttps://www.ibm .com/support/knowledgecenter/was_beta/com.ibm.websphere.base.doc/ae/crun_classload.html%23crun_classload__crun_classload_modes – achabahe