Я сгенерировал клиента 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, я ожидал, что они будут демаршированы в передаваемые объекты. Может быть, мне нужно сделать что-то еще?
Любой совет / помощь с благодарностью!