Jersey JAX-RS中的可选路径段

问题描述 投票:0回答:2

我已经搜索了数小时,但还不太正确。

我正在处理的项目上的API未版本化(/controller/blah),因此我们要介绍版本化。例如,我们有一个与@Path("/controller")关联的类。为了避免API中断,现在自然必须支持//v1/,因此以下内容将有效:

/controller/blah
/v1/controller/blah

我觉得必须有一个简单的解决方案,使我丢失?

提前感谢!

java jersey
2个回答
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>

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>

0
投票
您可以使用选项regex非常容易地为您的URI加上前缀。

下面的路径将同时匹配/foo/v1/foo

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

© www.soinside.com 2019 - 2024. All rights reserved.