2011-11-04 19 views
9

Cuando uso wsimport para generar proxies para algunos servicios, la firma del método resultante para cada puerto no parece usar los tipos complejos especificados en el WSDL; pero aún noté que con algunos otros servicios sí lo hace.wsimport no usa tipos de entrada complejos

Esto ha sucedido en varios servicios, pero el ejemplo más reciente es AWSEConsumerService de Amazon (link to WSDL). Cuando genero el código proxy del servicio usando wsimport, obtengo firmas de métodos como las siguientes para cada puerto.

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

que esperaría este método toma el parámetro complejo único especificado por el WSDL (en este caso un objeto ItemLookup). ¿Estoy básicamente malentendiendo algo o hay algo anormal que ocurre con la generación de código?

Respuesta

7

Me encontré con un problema similar con AWS. He seguido la descripción de configuración API para Java (página 10 de este pdf

En el paso 2 (se dice para Eclipse 3.2) debe crear un registro (nombre sugessted es jaxws-custom.xml) con el siguiente contenido:

<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> 

y luego ejecutar el comando wsimport con la opción -b-jaxws custom.xml

no he descubierto lo que es exactamente el problema, sino que lo hizo el truco para mí.

+0

Esto funcionó para mí. Aunque el código original no era inutilizable, este cierto dio como resultado un código mucho más limpio y legible. Todavía tengo curiosidad de por qué algunos servicios dan como resultado esto, pero otros no. –

+0

El wsdlLocation también puede ser un archivo local. – Aaron

Cuestiones relacionadas