3

Mavenを使用したマルチモジュールプロジェクトがあります。モジュールの1つに、Apache CXFFramework2.5.4を使用して開発されたいくつかのWebサービスがあります。現在、2つの「問題」または質問があります。

まず、リストを返す必要があるWebサービスの1つのメソッドを呼び出すと、リストが空の場合、空のリストではなく「null」が返されます。使用しているCXFバージョンのバグであるか、メソッドまたは応答の定義を変更するためにアノテーションを使用する必要があるかどうか、問題の原因を突き止めようとしましたが、何も見つかりませんでした。同じ問題を抱えている人を見たことがありますが、解決策はありません。

私が聞きたかったもう1つのことは、MVCパターンを使用してWebアプリケーションを開発しているということです。ClasspathXmlCpplicationContextを使用してからcontext.getBean()を使用する代わりに、コントローラーからWebサービスを呼び出す方法を考えています。

たとえば、クライアント側のWebサービスの1つのBean定義は次のとおりです。

<jaxws:client id="deviceWSClient"
        serviceClass="..IDeviceWebService"
        address="http://localhost:8080/../DeviceWS" /> 

@Autowiredまたは@WebServiceRefアノテーションを使用してすでに試しました。これらを使用すると、機能しますが、WebサービスへのHTTPリクエストを実行しないため、ローカルリポジトリから依存関係を取得すると思います。私が必要としているのは、このBeanをコントローラーに注入する方法だと思います。

4

2 に答える 2

4

あなたの質問に答えるために

最初の質問の場合:リストが空の場合、CXFバージョン2.6.1によって正しく処理されます-サービスは空を返します。タイプが次のように定義されているサンプルサービスがあることを示すために、次のようにします。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "MemberSearchResponse", namespace="http://bk.org/memberservice/" )
public class MemberSearchResponse {

    @XmlElementWrapper(name="memberDetails")
    private List<MemberDetail> memberDetails;

上記の空のmemberDetailsを返す場合、ネットワークを通過するxmlは次のとおりです。

    <ns2:searchMemberResponse xmlns:ns2="http://bk.org/memberservice/">
        <ns2:MemberSearchResponse>
           <memberDetails/>
        </ns2:MemberSearchResponse>
    </ns2:searchMemberResponse>

編集

上記のようにラッパータイプの一部として正しく処理されますが、ラッパータイプを返す代わりにリストが直接返される場合は、nullを返します。

このように定義されたWebサービスインターフェースについて考えてみます。

@WebMethod(operationName = "searchMember")
    List<MemberDetail> searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest);

返されるリストが空のリストである場合、CXF2.6.1によってもnullとしてシリアル化されます。

回避策は、ラッパータイプを使用することです

編集終了

2番目の質問:

次の方法でクライアントBeanを作成しています。

<jaxws:client id="deviceWSClient"
        serviceClass="..IDeviceWebService"
        address="http://localhost:8080/../DeviceWS" /> 

この方法でSpringBeanを作成したら、通常のSpring Beanと同じように扱い、通常のSpring Beanと同じように注入できます。たとえば、次のように注入します。

 <bean id="consumerBean" class="...">
    <property name="deviceWS" ref="deviceWSClient">
 </bean>

または使用する@Autowired

@Autowired IDWebService deviceWSClient

またはユーザー@Resource

@Resource IDWebService deviceWSClient

これらは、Beanに注入する通常の方法です。

私はあなたが遊ぶことができるこのgithubの場所にサンプルアプリケーションを持っています: https ://github.com/bijukunjummen/memberservice-codefirst.git

を使用してサーバーを起動し、CXFサービスに要求を行うmvn tomcat:runテストを実行するだけです。org.bk.memberservice.TestCxfIntegrationTest

于 2012-07-13T01:29:32.360 に答える
0

@WebServiceRefSpringフォーラムでこのリンクをたどると、おそらく機能します。そこで、jaxwsの構成に別の方法を使用します。リストの最後の投稿を参照してください。

クライアントを定義する別の方法は、このSOの質問で説明されています。たとえば、追加の構成を行った後、最終的に@Autowiredアノテーションを使用するソリューションがあります。質問の最後の答えを参照してください。

あなたが言及した別の問題は、このcxfリスト関連の問題に関するもので、問題の回避策についても解決策が示されています。ですから、これはバグです。バージョン2.2.7では修正されていますが、バージョン2.2.9でも問題が再び発生します。バージョン2.5.4までは、エラー状態に戻っていることを確認してください。問題が解決した場合は、まだ回避策を試すことができます。

于 2012-07-11T19:07:33.880 に答える