在关于提取请求参数的docs.oracle(https://docs.oracle.com/javaee/7/tutorial/jaxrs002.htm)中,我们有:
如果无法将URI路径模板变量强制转换为指定类型,则JAX-RS运行时会向客户端返回HTTP 400(“错误请求”)错误。 如果无法将@PathParam注释强制转换为指定类型,则JAX-RS运行时会向客户端返回HTTP 404(“未找到”)错误。
有人可以解释一下这个区别吗,也许举个例子?
答案 0 :(得分:0)
我不知道为什么,但是如果您使用路径参数定义方法,并且在将字符串强制转换为自定义类型时失败,那么jax-rs(在我的情况下是servlet)将返回404错误,这是非常奇怪和意外的。 / p>
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初始化参数中。
<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>