在jax-rs中提取请求参数期间出现错误请求错误(400)或未找到错误(404)

时间:2018-05-21 07:55:23

标签: jax-rs

在关于提取请求参数的docs.oracle(https://docs.oracle.com/javaee/7/tutorial/jaxrs002.htm)中,我们有:

  

如果无法将URI路径模板变量强制转换为指定类型,则JAX-RS运行时会向客户端返回HTTP 400(“错误请求”)错误。   如果无法将@PathParam注释强制转换为指定类型,则JAX-RS运行时会向客户端返回HTTP 404(“未找到”)错误。

有人可以解释一下这个区别吗,也许举个例子?

1 个答案:

答案 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>