当对@Path片段使用regex时,Jersey运行时对不匹配regex模式的资源返回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。
您可以在请求到达API之前使用ContainerRequestFilter
来捕获请求,并使用注入的UriInfo
来确定是否存在用户路径元素。如果存在,请检查用户名的有效性。
添加到@Eric Stein的响应中,在@Path中使用regex将导致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 {
}