Java 异常:com.fasterxml.jackson.core.JsonParseException:HttpMessageEndableException

Java 异常:com.fasterxml.jackson.core.JsonParseException:HttpMessageEndableException,java,spring,spring-boot,Java,Spring,Spring Boot,当我尝试在java Spring引导中使用以下输入对布尔字段的无效值执行Post消息时,我得到了一个HttpMessageGenoTreadableException: { "User":"xyz", "email":"xyz@email.com", "isAdmin":"No" ( This is Boolean in my API Bean expecting true or false) } 我分别在控制台和响应正文中收到以下错误消息: com.fasterxml.jack

当我尝试在java Spring引导中使用以下输入对布尔字段的无效值执行Post消息时,我得到了一个HttpMessageGenoTreadableException:

{
 "User":"xyz",
 "email":"xyz@email.com",
 "isAdmin":"No"    ( This is Boolean in my API Bean expecting true or false) 
}
我分别在控制台和响应正文中收到以下错误消息:

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'yes': was expecting ('true', 'false' or 'null')at [Source: (PushbackInputStream); line: 29, column: 29]
以下为回应机构:

{
"Code": "JSON_REQUEST_INVALID",
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Unrecognized token 'yes': was expecting ('true', 'false' or 'null'); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unrecognized token 'yes': was expecting ('true', 'false' or 'null')\n at [Source: (PushbackInputStream); line: 29, column: 7] (through reference chain: com.sample.model.apibeans.userDetails[\"user\"])",
"path": "/userapi/v1"
}

但是,我希望错误消息更加具体,比如“isAdmin”字段中不允许出现“yes”!因为上面的消息没有给出关于哪个字段导致错误的太多信息

我使用了下面的@ControllerAdvice来捕获和覆盖消息,但是我无法获取发生此错误的字段。下面是异常处理方法的实现

    @ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
@ResponseBody
protected Errors handleHttpMessageNotReadableException(InputMismatchException ex, WebRequest request) {

    Errors errors = new Errors();
    Error error;
    error = new Error();
    error.setParams(null);
    error.setMessage("Json Contains "+ex.getCause());
    error.setTraceId(request.getHeader(TRACE_ID_HEADER_NAME));
    error.setStatus(Integer.toString(HttpStatus.BAD_REQUEST.value()));
    error.setCode("JSON_REQUEST_INVALID");
    errors.addErrorsItem(error);
    return errors;
}
Ex对象不提供任何方法来获取发生这种情况的路径或字段。我如何获得该信息,以便向消费者提供更具体的错误消息

注意:我使用的是Spring Boot 2.2.1


我已经看到了关于堆栈溢出的其他类似问题,但是没有一个能够解决这个问题。

我还没有得到java方法来获得确切的字段,但是由于一个错误模式,我得出了下面的字段提取可能有用的结论

 String  param= (String) ex.getMessage().subSequence(ex.getMessage().lastIndexOf("[")+1,ex.getMessage().lastIndexOf("]"));
这将获取发生错误的确切字段,并向客户端提供动态消息,如下所示:

  {
"Code": "JSON_REQUEST_INVALID",
"status": 400,
"error": "Bad Request",
"message": "unexpected value at isAdmin",
"path": "/userapi/v1"
}

我还没有得到java方法来获得确切的字段,但是由于一个错误模式,我总结出下面的字段提取是有用的

 String  param= (String) ex.getMessage().subSequence(ex.getMessage().lastIndexOf("[")+1,ex.getMessage().lastIndexOf("]"));
这将获取发生错误的确切字段,并向客户端提供动态消息,如下所示:

  {
"Code": "JSON_REQUEST_INVALID",
"status": 400,
"error": "Bad Request",
"message": "unexpected value at isAdmin",
"path": "/userapi/v1"
}

为什么要使用响应行中已经存在的冗余信息进行响应?@Michael-O well不是真正的冗余信息,当前消息是冗余的“无法识别的标记‘是’:应为‘真’、‘假’或‘空’”,此应为部分与布尔数据类型无关,即使数据类型是Number并且消费者发送字符串,我也会得到这个结果。所以我说的这个错误是多余的。状态代码和原因短语是多余的。@Michael-O我同意,但这不是真正的问题,这只是一个示例消息,不是实际的响应。所以,请忽略冗余,让我们关注主要问题。为什么要使用响应行中已经存在的冗余信息进行响应?@Michael-O well不是真正的冗余信息,当前消息是冗余的“无法识别的标记‘是’:应为‘真’、‘假’或‘空’”,这个期望的部分与布尔数据类型无关,即使数据类型是Number并且使用者发送字符串,我也会得到这个结果。所以我说的这个错误是多余的。状态代码和原因短语是多余的。@Michael-O我同意,但这不是真正的问题,这只是一个示例消息,不是实际的响应。所以请忽略冗余,让我们关注主要问题。