0

由于 WLS 12 的问题,将 JAX-RS 服务从 CXF 迁移到 Jersey。

我目前有一个具有 JAX-RS 注释的接口,然后是两个实现它的类(一个是实现默认功能的类,一个是存根实现)。

在 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 Endpoint 所在的包。但这不是我想要做的。在泽西岛有没有一种方法可以利用 Bean Id 作为泽西岛用来满足进入 SpringServlet 的请求的资源?

4

1 回答 1

0

我也一直在寻找这个问题的解决方案。但是,我认为没有像 Spring IOC 经常使用的接口、抽象类/实现这样的机制。

我能想到的一种方法就是不用担心 XML 配置的声明和实现。但是直接在Spring的beans.xml中将你的实现类设置为一个bean。例如:

同一个 Restful API 有两种不同的实现,比如说 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 
    }
}

然后,在您的 bean 设置 xml 中,只需将两个类都声明为 bean 以进行 restful 请求,并标记其中一个……(此处,RestA 处理对http://xxxx/restApi/post 的请求)

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

当你想切换你的 RESTful API 实现时,标记或删除其他 bean。

虽然这种方法算不上真正的解决方案,但它适用于管理同一个 restful api 的多个实现。

于 2013-07-19T04:00:58.983 回答