3

我们的应用程序中有一个现有的 Jersey REST 服务(URL:/rest/*)。示例 URL 如下所示:http://xxx:8080/app/rest/company/getdata

基于一个属性,我们需要将 REST 调用重定向到另一个上下文(URL:/newrest/*):示例 URL 如下所示:http://xxx:8080/app/newrest/company/getdata

因此,我在 web.xml 中添加了一个 servlet 映射。

所以,我的 web.xml 看起来像下面的代码片段。

<servlet>
    <servlet-name>ServletAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>xxx.httpservice</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ServletAdaptor</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>  
<filter>
    <filter-name>secureRESTFilter</filter-name>
    <filter-class>xxx.RESTSecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>secureRESTFilter</filter-name>
    <url-pattern>/rest/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>NewAdaptor</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>xxx.newhttpservice</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>NewAdaptor</servlet-name>
    <url-pattern>/newrest/*</url-pattern>
</servlet-mapping>

我已经编写了一个过滤器(用于检查 ServletAdaptor servlet 上的属性,如果需要,我需要重定向到 NewAdaptor servlet。此外,最终响应应该由 Servlet Adapter servlet 使用来自 NewAdaptor servlet 的响应发回,如果必要的(基于属性)。

我需要解决这个问题的方向。请帮忙。

我的过滤器类中的 dofilter 方法如下所示:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {     
    HttpServletRequest request = (HttpServletRequest) req;    
    String productMode = "b";//hardcoded for this example    
    String url = request.getRequestURL().toString();
    if(productMode.equals("a")){
        chain.doFilter(req, res);
    }else{
        url=url.replace("rest", "newrest");
        req.getRequestDispatcher(url).forward(req, res);
    }

}

但是 RequestDispatcher 似乎没有将请求转发到新的 url。

4

1 回答 1

1

据我了解,您正在尝试创建新服务或集成更新的服务。理想情况下,您可以版本化 URL 以支持将来的向后兼容性。例如 http://{xxx}:8080/app/rest/v1_0/company/getdata,http://{xxx}:8080/app/rest/v2_0/公司/getdata 等

为什么不将新的 API 调用包装在现有的 API 调用中?为了让消费者与您的 API 对话,您在内部调用较新的 API 并使用它的响应。然后您要么返回新对象,要么将对象包装在它周围。

您需要真正重新审视您尝试采用的策略!

于 2013-05-14T06:32:30.417 回答