gpt4 book ai didi

java - 解析 Web 服务响应时出现问题 (Metro/JAXB)

转载 作者:行者123 更新时间:2023-11-30 11:54:52 26 4
gpt4 key购买 nike

我之前从 WSDL 生成了一个 Metro/JAXB 客户端,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<> 实例?什么?

这些元素包装在 SOAP 中的 GetSubscriberListResult 元素中,但由于接口(interface)方法在 @ResponseWrapper 中定义了该元素,我希望它们被解码到传入的对象中。也许我需要做其他事情?

非常感谢任何建议/帮助!

最佳答案

花了很多时间在 Internet 上搜索并找到一个较旧的引用资料,指出 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();
}

希望这对可能遇到同样问题的其他人有所帮助。

关于java - 解析 Web 服务响应时出现问题 (Metro/JAXB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com