Проблемы с анализом ответа веб-сервиса (Metro / JAXB) - PullRequest
2 голосов
/ 17 марта 2011

Я сгенерировал клиента Metro / JAXB из WSDL раньше, и маршаллинг / демаршаллинг классов Java в / из SOAP / XML работал без каких-либо проблем. Я создал нового клиента, и, похоже, возникли неустрашимые проблемы, и я не уверен, почему. 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 <> до того, как я позвоню? К чему?

Эти элементы обернуты в элемент GetSubscriberListResult в SOAP, но, поскольку метод интерфейса имеет тот, который определен в @ResponseWrapper, я ожидал, что они будут демаршированы в передаваемые объекты. Может быть, мне нужно сделать что-то еще?

Любой совет / помощь с благодарностью!

1 Ответ

1 голос
/ 17 марта 2011

Потратил довольно много времени на поиск в интернете и обнаружил более старую ссылку, в которой говорилось, что объекты 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();
}

Надеюсь, это поможет другим, кто мог столкнуться с той же проблемой.

...