我已经搜索了几个小时并且还没有完全正确。
我正在处理的项目的API没有版本化(<configuration>
<connectionStrings>
<add name="myConn"
connectionString="Data Source=PC6\SA;Initial Catalog=dbName;"/>
</connectionStrings>
...
</configuration>
),所以我们想引入版本控制。例如,我们有一个与/controller/blah
相关联的类。当然为了避免API破坏,现在必须支持@Path("/controller")
或/
,因此以下内容有效:
/v1/
我觉得必须有一个简单的解决方案,我错过了吗?
提前致谢!
答案 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")