1

我在尝试将旧的 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

我收到“不允许方法”响应。

4

2 回答 2

3

我通常不会/在我的路径中包含前导/尾随 's,所以我很确定@Path("rootLevel")并且@Path("methodLevel")实际上映射到rootLevel/methodLevel 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(){
    //...
  }
}

或者,您也许可以通过某种重定向来完成某些事情。例如,使用预匹配过滤器。我从来没有做过这样的事情,但文档建议“你甚至可以修改请求 URI”。:withAdminStatus考虑到这一点,您可以将URI 中的任何请求替换为,/:withAdminStatus以便它可以与正确的资源匹配。

于 2013-06-26T17:52:11.360 回答
1

我遇到了这篇文章:根上下文上的 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。

试试看

于 2013-06-26T21:55:37.243 回答