2012-04-16 7 views
12

Pracuję z plikiem WSDL klienta, który używa tej samej definicji elementu dla komunikatów wejściowych i wyjściowych, ale mam problem z uzyskaniem JAX-WS/JAXB, aby anulować reakcję.jax-ws/wsimport generuje WebMethod z odwołaniem void - to samo żądanie/odpowiedźWrapper

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

Z jakiegoś powodu, kod generowany przez wsimport ma powrotu void, a params INOUT nie wydają się być aktualizowane po otrzymaniu odpowiedzi.

/** 
* 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); 

Kiedy zadzwonić port.request(paramOne, paramTwo, requestList), widzę, że żądanie SOAP jest wysyłany do serwera, który reaguje z poprawną odpowiedź SOAP:

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

Jednak gdy uruchamiam moją aplikację w trybie debugowania Widzę każdą instancję RequestType w widoku zmiennych debuggera, ale ponieważ RequestsType ma <xsd:choice> z RequestData lub ResponseData, ta ostatnia ma wartość null, a RequestData jest taka, jak podałem.

Z powodzeniem użyłem JAX-WS w innych projektach, ale w tych przypadkach wygenerował kod z @WebResult i bez odwrotnym typem zwracanym po WebResult. W tym projekcie, myślę, że nie dostaję WebResult, ponieważ JAX-WS zdecydował, że typy żądania i odpowiedzi są takie same i może ponownie użyć tego samego obiektu - ale jak mogę go zaktualizować ten obiekt danymi z odpowiedź?

+0

Czy możesz wysłać swój dokument WSDL? – Phani

Odpowiedz

10

Miałem dokładnie ten sam problem. Eksperymentowałem z nazwami, których używałem dla różnych typów, elementów, nazw wiadomości, nazw operacji i tym podobnych. I wreszcie znalazł klucz i powiedział coś w swoim pytaniu faktycznie got me blisko odpowiedź:

W tym projekcie, myślę, że nie dostaję się WebResult ponieważ JAX-WS zdecydowała, że ​​wniosek i Typy odpowiedzi są takie same i można ponownie użyć tego samego obiektu - ale w jaki sposób mogę go zaktualizować do tego obiektu danymi z odpowiedzi?

Zajrzałem do mojego pliku wsdl, który generował podobny kod Java (z pustym powrotem i listą parametrów zamiast z jednym parametrem obiektu). Ale mam różne typy wejścia i wyjścia. Co z moim wsdl było podobne do twojego?

Nazwa operacji była taka sama, jak nazwa elementu zdefiniowanego dla typu wejścia. Proponuję zmienić nazwę swojej operacji z "request" na coś takiego jak "processRequests", lub pozostawić samą nazwę operacji i zmienić nazwę elementu używanego dla definicji komunikatów.

<wsdl:operation name="requests"> 

staje

<wsdl:operation name="processRequests"> 

Chciałbym usłyszeć, czy to działa dla Ciebie.

+0

Niestety, przeszedłem do innej firmy i nie mam już dostępu do kodu tego projektu.Gdybym miał kontrolę nad schematem WSDL, musiałbym zmienić główny element odpowiedzi z "żądania" na "odpowiedź" –

+0

Cześć! Znam ten sam błąd. Zmiana nazwy operacji działa. Zach, czy wiesz, czy jest to ograniczenie wsimport, czy też jest sposób na umożliwienie wsimportowi obsługi przypadków, w których nazwa operacji jest taka sama, jak nazwa typu parametru żądania? – Arci

+0

@Arci Nie jestem tego pewien. Jeśli zmiana nazwy operacji nie jest rozwiązaniem, z którym można faktycznie przejść (być może klucz WEDL jest poza kontrolą), może warto tworzyć klasy za pomocą innego narzędzia, na przykład Axis. – ZachOfAllTrades

11

Możesz rozwiązać ten problem, instruując JAX-WS, aby wyłączał zawijanie. Odbywa się to poprzez plik powiązań JAX-WS.

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

To jest właściwa odpowiedź, upvoting. Tylko uwaga: zapiszesz powyższy kod w pliku * .xjb i poinstruujesz go, żeby używał go w następujący sposób: "wsimport -b disable-wrappings.xjb your.wsdl" – Aramir

+1

Prawidłowa odpowiedź, zmarnowałeś trochę czasu, dopóki tu nie dotarłem .. .... – AntJavaDev

+0

Isaac i @Aramir Wpadłem w łzy radości, kiedy znalazłem twoją odpowiedź. Dziękuję bardzo. – cristianoms