Springboot引发Jackson异常

时间:2018-12-19 12:44:33

标签: spring-boot jackson jackson-databind

在测试期间,我遇到了这个问题。我发布了带有控制器类和模型输入的rest API。 在调用API时,已使用数组[{“ a”:1,“ b”:2}]而不是单个字符串。触发了以下错误:

{

"timestamp": "2018-12-19T12:33:36.729+0000",
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token\n at [Source: (PushbackInputStream); line: 3, column: 14] (through reference chain: com.xy.df.model.inputReq[\"req\"])",
"path": "x/y/z"

}

我们没有在application中明确地在POM中导入JACKSON依赖项。我注意到在父pom jackson版本中使用的是:2.9.5

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>

1。RCE是否容易受到攻击?如何在Spring-boot中解决此问题? 2.如何抑制/覆盖异常消息,以使客户端永远不知道底层使用了哪些库?

2 个答案:

答案 0 :(得分:2)

JsonMappingException: out of START_ARRAY token异常是由杰克逊对象映射器抛出的,因为它期望一个Object {},而它却找到了一个Array [{}]作为响应。

可以通过在Object的参数中将Object[]替换为geForObject("url",Object[].class)来解决。 参考文献:

  1. Ref.1
  2. Ref.2
  3. Ref.3

答案 1 :(得分:0)

我已解决问题。在继续之前,您需要了解几个非常有用的注释- @ExceptionHandler-此处理程序可帮助您定义要捕获其异常的错误类 @controller建议-它可以满足跨领域的需求。任何作为控制器建议提及的类,均可用于您的微服务下的所有控制器。

@ControllerAdvice
public class ExceptionController {

    @Autowired
    SomeGenericResponse someGenericResponse ; /* data model of common response */

    @ExceptionHandler(value = <My case Jackson Class>.class)
    public ResponseEntity<SomeGenericResponse> CustomException(HttpServletRequest req, HttpServletResponse res,Exception ex) {


        someGenericResponse.setMessage("Your Message");
        someGenericResponse.setStatus("false");

        return new ResponseEntity<SomeGenericResponse> someGenericResponse ,HttpStatus.BAD_REQUEST);
    }
}