2011-11-04 10 views
9

Quando utilizzo wsimport per generare proxy per alcuni servizi, la firma del metodo risultante per ciascuna porta non sembra utilizzare i tipi complessi specificati nel WSDL; ma ho notato che con altri servizi lo fa.wsimport che non utilizza tipi di input complessi

Questo è successo su più servizi, ma l'esempio più recente è Amazon AWSEConsumerService (link to WSDL). Quando si genera il codice del proxy del servizio utilizzando wsimport, ottengo firme del metodo come le seguenti per ciascuna porta.

@WebMethod(operationName = "ItemLookup", action = "http://soap.amazon.com/ItemLookup") 
@RequestWrapper(localName = "ItemLookup", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01", className = "com.aws.CommerceService.ItemLookup") 
@ResponseWrapper(localName = "ItemLookupResponse", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01", className = "com.aws.CommerceService.ItemLookupResponse") 
public void itemLookup(
    @WebParam(name = "MarketplaceDomain", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    String marketplaceDomain, 
    @WebParam(name = "AWSAccessKeyId", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    String awsAccessKeyId, 
    @WebParam(name = "AssociateTag", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    String associateTag, 
    @WebParam(name = "Validate", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    String validate, 
    @WebParam(name = "XMLEscaping", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    String xmlEscaping, 
    @WebParam(name = "Shared", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    ItemLookupRequest shared, 
    @WebParam(name = "Request", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01") 
    List<ItemLookupRequest> request, 
    @WebParam(name = "OperationRequest", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01", mode = WebParam.Mode.OUT) 
    Holder<OperationRequest> operationRequest, 
    @WebParam(name = "Items", targetNamespace = "http://webservices.amazon.com/AWSECommerceService/2011-08-01", mode = WebParam.Mode.OUT) 
    Holder<List<Items>> items); 

ci si aspetterebbe questo metodo prendere il parametro complesso unico specificato in WSDL (in questo caso un oggetto ItemLookup). Sono fondamentalmente frainteso qualcosa o c'è qualcosa di anormale che accade con la generazione del codice?

risposta

7

Ho riscontrato un problema simile con AWS. Ho seguito la descrizione di installazione API per Java (pagina 10 di questo pdf

Al punto 2 (si dice per Eclipse 3.2) è necessario creare un file (nome sugessted è jaxws-custom.xml) con il seguente contenuto:

<jaxws:bindings wsdlLocation="http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
<jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
</jaxws:bindings> 

e quindi eseguire il comando wsimport con l'opzione -b jaxws-custom.xml

non ho capito che cosa esattamente sia il problema, ma che ha fatto il trucco per me.

+0

Questo ha funzionato per me. Anche se il codice originale non era inutilizzabile, questo certo ha portato a un codice molto più pulito e più leggibile. Sono ancora curioso del perché alcuni servizi si traducono in questo, ma altri no. –

+0

La posizione wsdl può anche essere un file locale. – Aaron

Problemi correlati