2

以前にWSDLからMetro/JAXBクライアントを生成しましたが、SOAP/XMLとの間のJavaクラスのマーシャリング/アンマーシャリングは問題なく機能しました。新しいクライアントを生成しましたが、マーシャリング解除の問題があるようですが、その理由はわかりません。WSDLは非常に大きく(> 27,000行)、大文字と小文字を除いていくつかの要素名が同じであるため、-B-XautoNameResolutionを使用する必要がありました。

私はこのメソッド/操作を実行しようとしています:

@WebService(name = "servicePortType", targetNamespace = "urn:service")
@XmlSeeAlso({
    ObjectFactory.class
})
public interface ServicePortType {


    /**
     * Service definition of function unsp__GetSubscriberList
     * 
     * @param result
     * @param totalSubsFound
     * @param getSubListReq
     * @param paginatedInfo
     * @param getSubscriberListData
     */
    @WebMethod(operationName = "GetSubscriberList")
    @RequestWrapper(localName = "GetSubscriberList", targetNamespace = "urn:service", className = "service.GetSubscriberList")
    @ResponseWrapper(localName = "GetSubscriberListResult", targetNamespace = "urn:service", className = "service.GetSubscriberListResult")
    public void getSubscriberList(
        @WebParam(name = "GetSubListReq", targetNamespace = "")
        GetSubscriberListRequest getSubListReq,
        @WebParam(name = "Result", targetNamespace = "", mode = WebParam.Mode.OUT)
        Holder<ResultCodeStruct> result,
        @WebParam(name = "PaginatedInfo", targetNamespace = "", mode = WebParam.Mode.OUT)
        Holder<PaginatedInfo> paginatedInfo,
        @WebParam(name = "TotalSubsFound", targetNamespace = "", mode = WebParam.Mode.OUT)
        Holder<Integer> totalSubsFound,
        @WebParam(name = "GetSubscriberListData", targetNamespace = "", mode = WebParam.Mode.OUT)
        Holder<GetSubscriberListData> getSubscriberListData);

}

このメソッドは、サブスクライバーデータとサブスクライバーの総数を返します。私の電話は次のようになります。

public int getTotalSubscriptions()
        throws Exception
{
    GetSubscriberListRequest subscriberListRequest = factory.createGetSubscriberListRequest();
    Holder<ResultCodeStruct> result = null;
    Holder<PaginatedInfo> paginatedInfo = null;
    Holder<Integer> totalSubsFound = null;
    Holder<GetSubscriberListData> subscriberListData = null;

    subscriberListRequest.setMaxSubscribers(factory.createGetSubscriberListRequestMaxSubscribers(1));

    port.getSubscriberList(subscriberListRequest,
            result,
            paginatedInfo,
            totalSubsFound,
            subscriberListData);

    if (result.value.getResultCode() != CODE_SUCCESS)
    {
        throw new Exception("Failed call");
    }

    return totalSubsFound.value.intValue();
}

結果オブジェクトでNullPointerExceptionが発生します。SOAP呼び出しをトレースしましたが、返されるXMLは、Result要素を含めて期待どおりです。

私はこれまでWebParam.Mode.OUTに遭遇したことがありません。呼び出しを行う前に、Holder <>インスタンスを初期化する必要がありますか?何に?

これらの要素はSOAPのGetSubscriberListResult要素にラップされていますが、インターフェイスメソッドには@ResponseWrapperで定義されている要素があるため、渡されたオブジェクトにマーシャリングされないことを期待していました。何か他のことをする必要があるのでしょうか。

アドバイス/ヘルプは大歓迎です!

4

1 に答える 1

1

インターネットでの検索にかなりの時間を費やし、Holderオブジェクトを初期化する必要があることを示す古い参照を見つけました。したがって、修正されたメソッド呼び出しは次のようになります。

public int getTotalSubscriptions()
        throws Exception
{
        GetSubscriberListRequest subscriberListRequest = factory.createGetSubscriberListRequest();
        Holder<ResultCodeStruct> result = new Holder<ResultCodeStruct>(factory.createResultCodeStruct());
        Holder<PaginatedInfo> paginatedInfo = new Holder<PaginatedInfo>(factory.createPaginatedInfo());
        Holder<Integer> totalSubsFound = new Holder<Integer>(new Integer(0));
        Holder<GetSubscriberListData> subscriberListData = new Holder<GetSubscriberListData>(factory.createGetSubscriberListData());

    subscriberListRequest.setMaxSubscribers(factory.createGetSubscriberListRequestMaxSubscribers(1));

    port.getSubscriberList(subscriberListRequest,
            result,
            paginatedInfo,
            totalSubsFound,
            subscriberListData);

    if (result.value.getResultCode() != CODE_SUCCESS)
    {
        throw new Exception("Failed call");
    }

    return totalSubsFound.value.intValue();
}

これが同じ問題に遭遇した可能性のある他の人に役立つことを願っています。

于 2011-03-17T17:31:30.327 に答える