我不知道为什么,但是如果您使用路径参数定义方法并且它在将字符串转换为自定义类型时失败,那么 jax-rs(在我的例子中是 jersey servlet)返回 404 错误,这是非常奇怪和意外的。
package com.example.jaxrs.api;
...
@GET
@Path("/{id}/info")
public Response info(@PathParam UUID id) { ... }
curl -X GET http://127.0.0.1:8080/api/123/info --> HTTP ERROR 404 Not Found
这种行为是可以改变的。只需创建简单的 ExceptionMapper,捕获 ParamException,并返回正确的“400 Bad Request”响应。
package com.example.jaxrs.errors;
@Provider
public class PathParamExceptionMapper implements ExceptionMapper<ParamException> {
@Override
public Response toResponse(ParamException exception) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
不要忘记注解@Provider,并将带有错误处理程序的包添加到servlet init param。
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.example.jaxrs.api;com.example.jaxrs.errors</param-value>
</init-param>
</servlet>