0

WLS 12 の問題のため、JAX-RS サービスを CXF から Jersey に移行します。

現在、JAX-RS アノテーションを持つインターフェイスと、それを実装する 2 つのクラスがあります (1 つはデフォルト機能を満たすクラスで、もう 1 つはスタブ実装です)。

CXF では、プロパティを使用して、どの実装クラスが Spring インジェクションを通じて ReST 要求を満たすかを制御できます。

   <alias name="restProxyApi${restProxyApi.sib:Impl}" alias="restProxyApiEndpoint" />

   <jaxrs:server id="jaxrs.restProxyApi" address="/">
    <jaxrs:serviceBeans>
        <ref bean="restProxyApiEndpoint" />
    </jaxrs:serviceBeans>
   </jaxrs:server>

ジャージーでこれを行う方法がわかりません。Jersey は、Spring のコンポーネント スキャンを使用して、API エンドポイントが存在するパッケージを宣言することを望んでいるようです。しかし、これは私がやりたいことではありません。ジャージーで、SpringServlet に着信するリクエストを満たすためにジャージーが使用するリソースとして Bean ID を利用できる方法はありますか?

4

1 に答える 1

0

私もしばらくこの問題の解決策を探していました。ただ、Spring IOCでよく使われるインターフェースや抽象クラス/実装のような仕組みはないと思います。

私が思いつく 1 つの方法は、XML の構成に関する宣言と実装について気にしないことです。ただし、Spring の beans.xml で実装クラスを Bean として直接設定します。例えば:

同じ Restful API には 2 つの異なる実装があり、RestA と RestB としましょう。コードは次のようになります...

@Path("/restApi")
public class RestA {
    @POST
    @Path("post/")
    public String print(@Context HttpServletRequest req, InputStream is) {
       // RestA: do something 
    }
}

@Path("/restApi")
public class RestB {
    @POST
    @Path("post/")
    public String print(@Context HttpServletRequest req, InputStream is) {
       // RestB: do something 
    }
}

次に、xml を設定する Bean で、両方のクラスを安静要求用の Bean として宣言し、そのうちの 1 つをマークします ... (ここでは、RestA はhttp://xxxx/restApi/postへの要求を処理します)

<beans>
    <bean id="restA" class="a.b.X.RestA" />
    <!-- <bean id="restB" class="a.b.y.RestB" /> -->
</beans>

また、安静な API 実装を切り替える場合は、他の Bean をマークまたは削除します。

このアプローチは実際のソリューションとは見なされませんが、同じ RESTful API への複数の実装を管理する場合に有効です。

于 2013-07-19T04:00:58.983 に答える