我已经搜索了数小时,但还不太正确。
我正在处理的项目上的API未版本化(/controller/blah
),因此我们要介绍版本化。例如,我们有一个与@Path("/controller")
关联的类。为了避免API中断,现在自然必须支持/
或/v1/
,因此以下内容将有效:
/controller/blah
/v1/controller/blah
我觉得必须有一个简单的解决方案,使我丢失?
提前感谢!
我将使用过滤器来重定向与某些模式匹配的那些请求(在您的情况下为[[/ 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>
真的,您只需要为UPDATE
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>
下面的路径将同时匹配/foo
和/v1/foo
@Path("/{ver : (v1/)?}foo")