2

当对@Path 片段使用正则表达式时,Jersey 运行时会为与正则表达式模式不匹配的资源返回 404。有没有办法自定义此行为并返回 400 (BAD_REQUEST) 或在响应中添加有意义的消息?

@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}")

如果使用 users/1243 调用资源,则会导致 404。我想添加一条关于有效用户名模式的响应消息。我可以在 Restful 方法中移动验证并进行验证。但这很乏味。我有几十种方法,我需要从所有这些方法中调用验证。

编辑:由于应用程序影响,我正在使用 Jersey 1.17 而不能使用 Jersey 2.0。

4

2 回答 2

3

您可以使用 aContainerRequestFilter在请求到达 API 之前捕获请求,并使用注入UriInfo来确定是否存在用户路径元素。如果有,请检查用户名的有效性。

但是,我要指出,我认为 400 不是一个合理的回答。请求的语法没有任何问题。

于 2014-03-26T14:40:34.547 回答
1

要添加到@Eric Stein 的响应,在@Path 中使用正则表达式将导致 404 没有执行到达过滤器方法。因此,必须将验证推入过滤器方法中。为了中止调用并从下面代码中使用的过滤器返回自定义响应。



    //groovy code
    class MyCustomFilter implements ContainerRequestFilter
    {
      @Override
        public ContainerRequest filter(ContainerRequest request) {
    //do the validation for the resource URI and abort flow for errors
    throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND).entity("Not valid input").build())
    ...
    .. 
     //for success scenarios, return the request with optional customization

            return request;
        }
    }
    @ResourceFilters(MyCustomFilter)
    @Path('/users/{userId}/scripts')
    class MyJaxRsResource {

    }


于 2014-03-26T18:01:00.543 回答