对@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。答案 0 :(得分:3)
您可以使用ContainerRequestFilter
在请求到达API之前捕获请求,并使用注入的UriInfo
来确定是否存在用户路径元素。如果有,请检查用户名的有效性。
答案 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 {
}