2012-04-16 1 views
12

入力メッセージと出力メッセージに同じ要素定義を使用するクライアントのWSDLファイルを使用していますが、JAX-WS/JAXBを使用して応答を非整列化します。何らかの理由でjax-ws/wsimportは、void return - 同じRequest/ResponseWrapperを使用してWebMethodを生成します。

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

、wsimportのによって生成されたコードは、ボイドリターンを持ち、およびINOUT paramsが応答を受信したときに更新されていないようです。

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

私はport.request(paramOne, paramTwo, requestList)を呼び出すと、私はSOAPリクエストが有効なSOAP応答で応答サーバーに送信されていることを確認することができます:私は、デバッグモードで私のアプリを実行すると、しかし

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

デバッガの変数ビューにRequestTypeの各インスタンスが表示されますが、RequestsTypeRequestDataまたはResponseData<xsd:choice>を持っているため、後者はnullであり、RequestDataは私が提供したとおりです。

私は他のプロジェクトでJAX-WSをうまく使いましたが、その場合は@WebResultのコードを生成し、WebResultの名前を付けた非void型の戻り値を返します。このプロジェクトでは、JAX-WSが要求と応答の型が同じで、同じオブジェクトを再利用できると判断したため、WebResultを取得していないと思いますが、どうすればそのオブジェクトを応答?

+0

WSDLドキュメントを投稿してください。 – Phani

答えて

10

私はまったく同じ問題を抱えていました。 私はさまざまなタイプ、要素、メッセージ名、操作名などで使用していた名前を試しました。私は最終的に鍵を見つけ、そしてあなたがあなたの質問の中で述べて何かが、実際の答えに私が親しま:このプロジェクトで

、私はJAX-WSは、その要求を決定しましたので、私はWebResultが届かないと思います応答タイプは同じで、同じオブジェクトを再利用できますが、そのオブジェクトをレスポンスのデータで更新するにはどうすればよいですか?

同様のJavaコード(単一のオブジェクトパラメータの代わりにvoidリターンとパラメータリストを持つ)を生成していた私のwsdlを見ました。しかし、私はさまざまな入力と出力の種類があります。私のwsdlはあなたのものに似ていましたか?

操作の名前は、入力の種類に定義されている要素の名前と同じでした。操作名を「要求」から「processRequests」などに変更するか、操作名だけを残して、メッセージ定義に使用する要素の名前を変更することをお勧めします。

<wsdl:operation name="requests"> 

は、私はこれがあなたのために動作するかどうか聞いてみたい

<wsdl:operation name="processRequests"> 

になります。

+0

申し訳ありませんが、私は別の会社に移り、そのプロジェクトのコードにアクセスできなくなりました。私がWSDLスキーマのコントロールを持っていたなら、私は "要求"から "応答"への応答のルート要素を変更するでしょう –

+0

こんにちは!同じエラーが発生しました。操作名の変更は機能します。 Zachは、これがwsimportの制限であるかどうか知っていますか?または、操作名が要求パラメータ型の名前と同じであるケースをwsimportが処理する方法がありますか? – Arci

+0

@Arci私はそれについては分かりません。操作名の変更が実際に行える解決策ではない場合(おそらくwsdlがあなたのコントロールの外にあるかもしれません)、Axisのような別のツールでクラスを生成する価値があります。 – ZachOfAllTrades

11

これを解決するには、JAX-WSにラッピングを無効にするように指示します。これは、JAX-WSバインディング・ファイルを介して行われます。

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

これは正しい答えです、upvoting。ちょっとメモ:上記のコードを* .xjbファイルに保存し、wsimportに次のように使用するよう指示します: "wsimport -b disable-wrappings.xjb your.wsdl" – Aramir

+1

正解です。 .... – AntJavaDev

+0

アイザックと@アラミール私はあなたの答えを見つけたときに喜びの涙で爆発した。どうもありがとうございます。 – cristianoms

関連する問題