問題


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