我试图将旧的ERX休息路线移植到Jerey / JAX-RX时遇到了问题。
我正在尝试做这样的事情:
@Path("/v0/user")
@Controller
public class UserRouteController {
@GET
public Response getAllUsers(){
...
}
@GET
@Path("/{name}")
public Response getUserWithName(@PathParam("name") String name){
...
}
@GET
@Path(":accessibleWithNoRestriction")
public Response getUsersAccessibleWithNoRestriction(){
...
}
@GET
@Path(":withAdminStatus")
public Response getUsersWithAdminStatus(){
...
}
但是,泽西岛不想匹配我的http请求。
blahblah.com/v0/user:accessibleWithNoRestriction
我获得了无法允许的响应。
答案 0 :(得分:3)
我通常不在路径中包含前导/尾随/
,因此我非常确定@Path("rootLevel")
和@Path("methodLevel")
实际上映射到rootLevel/methodLevel
< em> not rootLevelMethodLevel
。
因此,在您的示例中,@Path("/v0/user")
和@Path(":withAdminStatus")
映射到/v0/user/:withAdminStatus
。尝试将您的路径更改为以下内容:
@Path("v0")
@Controller
public class UserRouteController {
@GET
@Path("user")
public Response getAllUsers(){
//...
}
@GET
@Path("user/{name}")
public Response getUserWithName(@PathParam("name") String name){
//...
}
@GET
@Path("user:accessibleWithNoRestriction")
public Response getUsersAccessibleWithNoRestriction(){
//...
}
@GET
@Path("user:withAdminStatus")
public Response getUsersWithAdminStatus(){
//...
}
}
或者,您可以通过某种重定向来解决问题。例如,使用Pre-matching Filter。我从来没有做过这样的事情,但是文档建议“你甚至可以修改请求URI”。考虑到这一点,您可以使用:withAdminStatus
替换URI中/:withAdminStatus
的任何请求,以便它可以与正确的资源匹配。
答案 1 :(得分:1)
我发现了这篇文章:JAX-RS Application on the root context - how can it be done?
尝试使用:
@WebFilter(urlPatterns = "/*")
public class PathingFilter implements Filter {
Pattern[] restPatterns = new Pattern[] {
Pattern.compile("/v0/user:.*")
};
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
String path = ((HttpServletRequest) request).getPathInfo();
for (Pattern pattern : restPatterns) {
if (pattern.matcher(path).matches()) {
String[] segments = path.split(":");
String newPath = segments[0] + "/" + segments[1];
newPath = ((HttpServletRequest) request).getServletPath() + "/" + newPath;
request.getRequestDispatcher(newPath).forward(request, response);
return;
}
}
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
然后你必须将方法中的@Path注释更改为“/ accessibleWithNoRestriction”
这样做会在匹配发生之前更改请求的uri。
试试