2011-03-16 64 views
2

我之前已经从WSDL生成了Metro/JAXB客户端,并且将Java类编组/解组到SOAP/XML中的工作没有任何问题。我产生了一个新的客户,似乎有解组问题,我不知道为什么。 WSDL非常大(> 27,000行),我不得不使用-B-XautoNameResolution,因为除了大小写外,其他元素名称相同。解析webservice响应的问题(Metro/JAXB)

我试图执行此方法/操作:

@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。在我打电话之前是否应该初始化持有人<>实例?什么?

这些元素封装在SOAP中的GetSubscriberListResult元素中,但由于接口方法具有在@ResponseWrapper中定义的方法,因此我期望它们被解组入传入的对象中。也许我需要做其他事情?

任何意见/帮助非常感谢!

回答

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(); 
} 

希望这有助于其他人谁可能都遇到过同样的问题。