【问题标题】:Inject Spring Bean as Endpoint with Jersey SpringServlet使用 Jersey SpringServlet 注入 Spring Bean 作为端点
【发布时间】:2013-07-11 00:23:29
【问题描述】:

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

【问题讨论】:

    标签: jersey


    【解决方案1】:

    我也一直在寻找这个问题的解决方案。但是,我认为没有像 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://x.x.x.x/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 的多个实现。

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多