[英]Concatenate class @Path annotation to method @Path annotation when using colon
我试图将旧的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
我得到一个No Method Allowed响应。
我通常不会在路径中包含前导/尾随/
,因此我非常确定@Path("rootLevel")
和@Path("methodLevel")
实际上映射到rootLevel/methodLevel
而不是 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(){
//...
}
}
或者,您可以通过某种重定向来解决问题。 例如,使用预匹配过滤器 。 我从来没有做过这样的事情,但是文档建议“你甚至可以修改请求URI”。 考虑到这一点,您可以使用带有/:withAdminStatus
的URI中的:withAdminStatus
替换任何请求,以便它可以与正确的资源匹配。
我遇到过这篇文章: 根文本上的JAX-RS应用程序 - 如何完成?
试试这个:
@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。
试试吧
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.