2011-11-04 29 views
9

Khi tôi sử dụng wsimport để tạo proxy cho một số dịch vụ, chữ ký phương thức kết quả cho mỗi cổng dường như không sử dụng các loại phức tạp được chỉ định trong WSDL; nhưng tôi đã nhận thấy rằng với một số dịch vụ khác.wsimport không sử dụng loại đầu vào phức tạp

Điều này đã xảy ra trên nhiều dịch vụ, nhưng ví dụ gần đây nhất là AWSEConsumerService của Amazon (link to WSDL). Khi tôi tạo mã proxy dịch vụ bằng cách sử dụng wsimport, tôi nhận được các chữ ký phương thức như sau cho mỗi cổng.

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

Tôi mong chờ phương pháp này cần một thông số phức tạp đơn theo quy định của WSDL (trong trường hợp này một đối tượng ItemLookup). Tôi cơ bản hiểu nhầm một điều gì đó hoặc có điều gì đó bất thường xảy ra với việc tạo mã không?

Trả lời

7

Tôi đã gặp sự cố tương tự với AWS. Tôi làm theo các mô tả thiết lập API cho Java (trang 10 này pdf

Trong bước 2 (nó nói cho Eclipse 3.2), bạn nên tạo một tập tin (tên sugessted là jaxws-custom.xml) với nội dung sau:

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

và sau đó chạy lệnh wsimport với các tùy chọn -b jaxws-custom.xml

tôi đã không tìm ra chính xác vấn đề là gì, nhưng điều đó đã làm các trick cho tôi.

+0

này làm việc Mặc dù mã ban đầu không thể sử dụng được, điều này chắc chắn ly dẫn đến mã sạch hơn và dễ đọc hơn. Tôi vẫn còn tò mò tại sao một số dịch vụ dẫn đến điều này nhưng những người khác thì không. –

+0

Vị trí wsdlLocation cũng có thể là một tệp cục bộ. – Aaron