2011-03-16 3 views
2

J'ai généré un client Metro/JAXB à partir d'un WSDL auparavant et le regroupement/démontage des classes Java vers/depuis SOAP/XML a fonctionné sans aucun problème. J'ai généré un nouveau client et il semble y avoir des problèmes de confusion et je ne sais pas pourquoi. Le WSDL est très volumineux (> 27 000 lignes) et j'ai dû utiliser -B-XautoNameResolution à cause de certains noms d'éléments étant les mêmes sauf cas.Problèmes d'analyse de la réponse webservice (Metro/JAXB)

Je suis en train d'exécuter cette méthode/opération:

@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); 

} 

Cette méthode renvoie les données d'abonné ainsi que le nombre total d'abonnés. Mon appel ressemble à ceci:

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

Je reçois un NullPointerException sur l'objet de résultat. J'ai suivi l'appel SOAP et le XML renvoyé est comme prévu incluant un élément Result.

Je n'ai jamais rencontré WebParam.Mode.OUT avant. Les instances du titulaire <> doivent-elles être initialisées avant de passer l'appel? À quoi? Ces éléments sont enveloppés dans un élément GetSubscriberListResult dans le SOAP, mais comme la méthode d'interface a celle définie dans @ResponseWrapper, je m'attendais à ce qu'ils soient unmarshalled dans les objets passés. Peut-être que je dois faire quelque chose d'autre?

Un conseil/aide est grandement apprécié!

Répondre

1

J'ai passé beaucoup de temps à chercher sur Internet et trouvé une ancienne référence indiquant que les objets Holder doivent être initialisés. Ainsi, les appels de méthode corrigés ressemble à ceci:

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

Hope this helps autres qui ont rencontré le même problème.

Questions connexes