問題
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`をロードします。汚い方法ですが、それはうまくいきます:)。