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が常に同じインスタンスを使用していることを確認してください。

  1. WAS構成画面で、モジュール・クラス・ローダーをに設定します.

" 親先生 "。

  1. WASフォルダで、WASルートフォルダの下に " classes "フォルダを作成し、

webservices-rt.jar`を WAS APPSERVER PROFILE \ classes \ webservices-rt.jar`のように入れてください。

WASインスタンスを再起動すると、WASは常に `webservices-rt.jar`をロードします。汚い方法ですが、それはうまくいきます:)。