WebSphere 7のメトロ – com.ibm.xml.xlxp2.jaxb.JAXBContextImpl互換性のない例外
問題
File:UserWS.java
package com.mkyong.user.ws;//import...
@WebService()
public class UserWS {
private UserBo userBo;
@WebMethod(exclude = true)
public UserBo getUserBo() {
return userBo;
}
@WebMethod(exclude = true)
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
@WebMethod(operationName = "listUser")
public List<User> listUser() throws SOAPException {
return userBo.listUser();
}
}
すべてがうまくいけば、サービスは期待どおりに動作しますが、「 “ userBo.listUser() `”がエラーを起こし、 `SOAPException`をWebサービスのクライアントに返すと、
クライアントはこれを得る:
Exception in thread "main"
javax.xml.ws.WebServiceException: No Content-type in the header!
これを示すWASログファイル:
Caused by: java.lang.ClassCastException: com.ibm.xml.xlxp2.jaxb.JAXBContextImpl
incompatible with com.sun.xml.bind.api.JAXBRIContext
at com.sun.xml.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:561)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
... 34 more
P.SこのWebサービスはTomcatで動作していますが、WebSphereでのみ失敗しました
解決策
`com.ibm.xml.xlxp2.jaxb.JAXBContextImpl`は
WAS
APPSERVER
PROFILE \ plugins \ com.ibm.ws.prereq.xlxp.jar
にあり、Metroライブラリーの
webservices-rt.jar
には1つも含まれていますcom.sun.xml.bind.v2.runtime.JAXBContextImpl`インスタンスのインスタンスを返します。例外が発生すると、WASは2つの異なるインスタンスを使用して同じJAXBバインディング・タスクを実行し、 “java.lang.ClassCastException”互換性のない例外を発生させます。
これを修正するには、WASが常に同じインスタンスを使用していることを確認してください。
-
WAS構成画面で、モジュール・クラス・ローダーをに設定します.
”
親先生
“。
-
WASフォルダで、WASルートフォルダの下に ”
classes
“フォルダを作成し、
webservices-rt.jar`を
WAS
APPSERVER
PROFILE \ classes \ webservices-rt.jar`のように入れてください。
WASインスタンスを再起動すると、WASは常に `webservices-rt.jar`をロードします。汚い方法ですが、それはうまくいきます:)。