代码之家  ›  专栏  ›  技术社区  ›  Joe

如何处理JAX-RS中的无效数据类型错误

  •  0
  • Joe  · 技术社区  · 6 年前

    我正在开发JAX-RS API,用户将以下JSON负载发送到我的API:

    {
        "text": "test search",
        "count": "myvalue"
    }
    

    如上所述, 计数 是POJO中的整数类型 SearchDetailsInfo.java

    请在下面找到我的控制器方法:

    @POST
    @Path("/myview")
    @Produces(MediaType.APPLICATION_JSON)
    public OrderedJSONObject getCatalogView(SearchDetailsInfo criteria,
                    @Context ContainerRequestContext containerRequestContext) {
            .... processing ....
    }
    

    Status Code : 400
    Status Message : Bad Request
    Body:
        Can not construct instance of java.lang.Integer from String value 'myvalue': 
        not a valid Integer value at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@bd8b3db; line: 5, column: 15] 
    

    由于存在数据类型不匹配,将引发无效的数据类型错误。

    不幸的是,我无法捕获这个异常,因为由于数据类型解析中的异常,请求没有进入控制器方法。

    我想知道,如何捕获这个异常,以便将错误响应更改为有意义的内容。

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   NikhilK    6 年前

    您可以通过实现错误映射器来处理这个问题。对于上面显示的示例,在将JSON数据映射到POJO时,内部处理中似乎抛出了异常。

    如果仔细查看日志,您会发现如下错误 InvalidFormatException JsonMappingException 在处理数据时。

    您可以为得到的错误创建异常映射器。我建议使用超级 因为它将处理无效类型、请求负载中的无效JSON等错误:

    @Provider
    public class GenericExceptionMapper extends Throwable implements ExceptionMapper<JsonMappingException> {
        @Override
        public Response toResponse(JsonMappingException thrExe) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("errorMessage", "Invalid input provided");
            return Response.status(400).entity(jsonObject.toString())
            .type("application/json").build();
        }
    }