복붙노트

[SPRING] JsonMappingException : java.lang.Integer의 인스턴스를 START_OBJECT 토큰에서 deserialize 할 수 없습니다.

SPRING

JsonMappingException : java.lang.Integer의 인스턴스를 START_OBJECT 토큰에서 deserialize 할 수 없습니다.

Spring Boot를 사용하여 작고 간단한 REST 서비스를 만들고 싶었다. 다음은 REST 서비스 코드입니다.

@Async
@RequestMapping(value = "/getuser", method = POST, consumes = "application/json", produces = "application/json")
public @ResponseBody Record getRecord(@RequestBody Integer userId) {
    Record result = null;
    // Omitted logic

    return result;
}

내가 보낸 JSON 객체는 다음과 같습니다.

{
    "userId": 3
}

그리고 여기에 예외가 있습니다 :

해결법

  1. ==============================

    1.분명히 Jackson은 전달 된 JSON을 정수로 역 직렬화 할 수 없습니다. 요청 본문을 통해 사용자의 JSON 표현을 보내려면 다음과 같이 다른 bean에 userId를 캡슐화해야합니다.

    분명히 Jackson은 전달 된 JSON을 정수로 역 직렬화 할 수 없습니다. 요청 본문을 통해 사용자의 JSON 표현을 보내려면 다음과 같이 다른 bean에 userId를 캡슐화해야합니다.

    public class User {
        private Integer userId;
        // getters and setters
    }
    

    그런 다음 해당 빈을 핸들러 메소드 인수로 사용하십시오.

    @RequestMapping(...)
    public @ResponseBody Record getRecord(@RequestBody User user) { ... }
    

    다른 bean을 생성하는 오버 헤드가 마음에 들지 않으면 경로 변수의 일부로 userId를 전달할 수 있습니다 (예 : / getuser / 15. 그것을하기 위해서 :

    @RequestMapping(value = "/getuser/{userId}", method = POST, produces = "application/json")
    public @ResponseBody Record getRecord(@PathVariable Integer userId) { ... }
    

    요청 본문에 더 이상 JSON을 보내지 않으므로 해당 consumes 속성을 제거해야합니다.

  2. ==============================

    2.아마도 Postman 클라이언트 또는 이와 유사한 JSON 텍스트를 본문에 포함하여 요청을 보내려는 것일 수 있습니다.

    아마도 Postman 클라이언트 또는 이와 유사한 JSON 텍스트를 본문에 포함하여 요청을 보내려는 것일 수 있습니다.

    {
     "userId": 3
    }
    

    이것이 정수가 아니기 때문에 잭슨에 의해 비 직렬화 될 수는 없습니다. java.lang Integer의 Integer 객체는 좀 더 복잡합니다.

    우편 배달부 요청이 작동하려면 간단히 중괄호 {}없이 넣으십시오.

    3
    
  3. from https://stackoverflow.com/questions/37471005/jsonmappingexception-can-not-deserialize-instance-of-java-lang-integer-out-of-s by cc-by-sa and MIT license