2012-04-16 30 views
12

Tôi đang làm việc với tệp WSDL của khách hàng sử dụng cùng định nghĩa phần tử cho các thông điệp đầu vào và đầu ra, nhưng tôi gặp sự cố khi nhận JAX-WS/JAXB để điều chỉnh phản hồi.jax-ws/wsimport tạo WebMethod với void return - cùng Yêu cầu/ResponseWrapper

<wsdl:message name="invokeServiceRequest"> 
    <wsdl:part element="impl:requests" name="multiRequestWrapper"/> 
</wsdl:message> 
<wsdl:message name="invokeServiceResponse"> 
    <wsdl:part element="impl:requests" name="result"/> 
</wsdl:message> 
<wsdl:portType name="GCGatewayPortType"> 
    <wsdl:operation name="requests"> 
     <wsdl:input message="impl:invokeServiceRequest" name="invokeServiceRequest"/> 
     <wsdl:output message="impl:invokeServiceResponse" name="invokeServiceResponse"/> 
    </wsdl:operation> 
</wsdl:portType> 

Vì lý do nào đó, mã được tạo bởi wsimport có khoảng trống và thông số INOUT dường như không được cập nhật khi nhận được phản hồi.

/** 
* This class was generated by the JAX-WS RI. 
* JAX-WS RI 2.1.7-b01- 
* Generated source version: 2.1 
*/ 
... 
@WebMethod 
@RequestWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType") 
@ResponseWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType") 
public void requests(
    @WebParam(name = "paramOne", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT) 
    Holder<String> paramOne, 
    @WebParam(name = "paramTwo", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT) 
    Holder<String> paramTwo, 
    @WebParam(name = "requestList", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT) 
    Holder<List<RequestType>> requestList); 

Khi tôi gọi port.request(paramOne, paramTwo, requestList), tôi có thể thấy rằng các yêu cầu SOAP được gửi đến máy chủ, mà phản ứng với một phản ứng SOAP hợp lệ:

<soapenv:Envelope ...> 
    <soapenv:Header /> 
    <soapenv:Body> 
     <requests ...> 
      <paramOne>1</paramOne> 
      <paramTwo>2</paramTwo> 
      <requestList> 
       <!-- various elements that JAXB has generated code for --> 

Tuy nhiên, khi tôi chạy ứng dụng của tôi trong chế độ gỡ lỗi , Tôi có thể xem từng trường hợp RequestType trong chế độ xem biến trình gỡ lỗi, nhưng vì RequestsType có một số <xsd:choice> với RequestData hoặc ResponseData, trường hợp sau là rỗng và RequestData là như tôi đã cung cấp.

Tôi đã sử dụng thành công JAX-WS trên các dự án khác, nhưng trong những trường hợp đó, mã được tạo với loại trả về @WebResult và không có giá trị được đặt tên sau WebResult. Trong dự án này, tôi nghĩ rằng tôi không nhận được WebResult vì JAX-WS đã quyết định rằng các kiểu yêu cầu và đáp ứng giống nhau và nó có thể tái sử dụng cùng một đối tượng - nhưng làm cách nào để cập nhật đối tượng đó với dữ liệu từ phản ứng?

+0

Bạn có thể vui lòng đăng tài liệu WSDL của mình không? – Phani

Trả lời

10

Tôi đã gặp chính xác cùng một vấn đề. Tôi đã thử nghiệm với các tên tôi đã sử dụng cho các loại khác nhau, các yếu tố, tên tin nhắn, tên hoạt động, và như vậy. Cuối cùng tôi đã tìm thấy chìa khóa và điều bạn đã nói trong câu hỏi của mình thực sự khiến tôi gần câu trả lời:

Trong dự án này, tôi nghĩ rằng tôi không nhận được WebResult vì JAX-WS đã quyết định yêu cầu đó và các kiểu phản hồi giống nhau và nó có thể tái sử dụng cùng một đối tượng - nhưng làm cách nào để tôi cập nhật đối tượng đó với dữ liệu từ phản hồi?

Tôi đã xem wsdl, mã tạo mã java tương tự (với khoảng trống và danh sách tham số thay vì một tham số đối tượng). Nhưng tôi có các loại đầu vào và đầu ra khác nhau. Điều gì về wsdl của tôi là tương tự như của bạn?

Tên của thao tác giống với tên của phần tử được xác định cho loại đầu vào. Tôi sẽ đề nghị bạn thay đổi tên hoạt động của bạn từ 'yêu cầu' thành một cái gì đó như 'processRequests', hoặc để lại tên hoạt động một mình, và thay đổi tên của phần tử được sử dụng cho các định nghĩa thư.

<wsdl:operation name="requests"> 

trở thành

<wsdl:operation name="processRequests"> 

Tôi muốn nghe nếu làm việc này cho bạn.

+0

Xin lỗi, tôi đã chuyển sang một công ty khác và không còn quyền truy cập vào mã cho dự án đó nữa.Nếu tôi có quyền kiểm soát lược đồ WSDL, tôi sẽ thay đổi phần tử gốc của phản hồi từ "yêu cầu" thành "phản hồi" –

+0

Xin chào! Tôi đang gặp phải lỗi tương tự. Thay đổi tên hoạt động hoạt động. Zach, bạn có biết nếu đây là một giới hạn của wsimport hoặc là có một cách để cho wsimport xử lý các trường hợp trong đó tên hoạt động là giống với tên của kiểu tham số yêu cầu? – Arci

+0

@Arci Tôi không chắc chắn về điều đó. Nếu thay đổi tên hoạt động không phải là một giải pháp mà bạn có thể thực sự đi cùng (có lẽ wsdl nằm ngoài tầm kiểm soát của bạn), thì có thể tạo ra các lớp có giá trị với một công cụ khác như Axis. – ZachOfAllTrades

11

Bạn có thể giải quyết vấn đề này bằng cách hướng dẫn JAX-WS tắt gói. Điều này được thực hiện thông qua một tập tin gắn kết JAX-WS.

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> 
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
</jaxws:bindings> 
+2

Đây là câu trả lời đúng, upvoting. Chỉ cần lưu ý: bạn lưu mã ở trên trong tệp * .xjb và hướng dẫn wsimport sử dụng nó như sau: "wsimport -b disable-wrappings.xjb your.wsdl" – Aramir

+1

Câu trả lời đúng, lãng phí một chút thời gian cho đến khi tôi đến đây .. .... – AntJavaDev

+0

Isaac và @Aramir Tôi bật khóc vì sung sướng khi tôi tìm thấy câu trả lời của bạn. Cảm ơn bạn rất nhiều. – cristianoms