Jersey JAX-RS中的可选路径段

时间:2015-09-25 02:31:30

标签: java jersey

我已经搜索了几个小时并且还没有完全正确。

我正在处理的项目的API没有版本化(<configuration> <connectionStrings> <add name="myConn" connectionString="Data Source=PC6\SA;Initial Catalog=dbName;"/> </connectionStrings> ... </configuration> ),所以我们想引入版本控制。例如,我们有一个与/controller/blah相关联的类。当然为了避免API破坏,现在必须支持@Path("/controller")/,因此以下内容有效:

/v1/

我觉得必须有一个简单的解决方案,我错过了吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我会使用过滤器来重定向符合特定模式的请求(在您的情况下 / v1 / * )。

您的过滤器应如下所示:

@WebFilter(filterName = "MyCustomFilter")
public class MyCustomFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        try {
            String url = ((HttpServletRequest)arg0).getRequestURI();
            //Take into account thet the url here would be the complete url. I just put an example taking into account
            //your application name is JAX-RS_tutorial
            String redirect = url.substring("/JAX-RS_tutorial/v1".length(), url.length());
            arg0.getRequestDispatcher(redirect).forward(arg0, arg1);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new ServletException(e);
        }

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

然后在 web.xml

<filter>
    <filter-name>MyCustomFilter</filter-name>
    <filter-class>com.myapplication.filter.MyCustomFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyCustomFilter</filter-name>
    <url-pattern>/v1/*</url-pattern>
</filter-mapping>
<servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/api/*</url-pattern>
    <url-pattern>/v1/api/*</url-pattern>
</servlet-mapping>

<强>更新

您真的需要为 servlet-mapping 添加新的 url-pattern 。所以只需要 web.xml

<servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/api/*</url-pattern>
    <url-pattern>/v1/api/*</url-pattern>
</servlet-mapping>

答案 1 :(得分:1)

您可以使用regex选项为URI加上前缀很容易地做到这一点。

以下路径将同时匹配/foo/v1/foo

@Path("/{ver : (v1/)?}foo")