【问题标题】:Bad Request Error (400) or Not Found Error (404) during extracting request parameters in jax-rs在 jax-rs 中提取请求参数期间出现错误请求错误 (400) 或未找到错误 (404)
【发布时间】:2018-10-30 20:12:43
【问题描述】:

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

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

谁能解释一下区别,可以举个例子吗?

【问题讨论】:

    标签: jax-rs


    【解决方案1】:

    我不知道为什么,但是如果您使用路径参数定义方法并且它在将字符串转换为自定义类型时失败,那么 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>
    

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多