使用Jersey SpringServlet将Spring Bean注入端点

时间:2013-07-11 00:23:30

标签: jersey

由于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端点存在的包。但这不是我想要做的。在Jersey中有没有办法可以利用Bean Id作为Jersey用来完成SpringServlet请求的资源?

1 个答案:

答案 0 :(得分: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中,只需将这两个类声明为restful请求的bean,并标记其中一个......(这里是对http://x.x.x.x/restApi/post的RestA句柄请求)

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

当您想要切换您的restful API实现时,请标记或删除其他bean。

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