针对404的Jersey JAX RS资源路径验证消息

时间:2014-03-26 14:27:50

标签: rest jax-rs jersey-1.0

对@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。

2 个答案:

答案 0 :(得分:3)

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

但是,我会注意到,我不认为400是一个合理的回应。请求的语法没有错。

答案 1 :(得分: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 {

    }