Error Logs🐾

@RequestBody 사용 Json데이터, DTO없이 받는방법

hae02y 2023. 8. 20. 17:55
반응형

문제

@PostMapping 과 @PatchMapping에서는 DTO를 만들어 @RequestBody를 이용해 데이터를 받았다. 하지만 @DeleteMapping에서는 DTO를 만들어서 받을정도로 데이터가 많이 필요하지않았다. 필요한데이터는 userId 단하나이기때문에 아래 코드와 같이 데이터를 받으려고 시도하였다.

@DeleteMapping("/delete/{question-id}")
    public ResponseEntity deleteQuestion(@PathVariable("question-id") Long questionId,
                                         @RequestBody Long userId){ //userId를 Long으로 받음
                                         
        questionService.deleteQuestion(questionId, userId);

        return new ResponseEntity(HttpStatus.NO_CONTENT);
    }

하지만 에러가 발생하였다.

 

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.Long` from Object value (token `JsonToken.START_OBJECT`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.Long` from Object value (token `JsonToken.START_OBJECT`)<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 1]]

데이터 유형 불일치: java.lang.Long을 예상하고 있지만 JSON에 단순 숫자 대신 객체(중괄호 {}로 둘러싸인)가 포함되어 있으면 이 에러가 발생할 수 있습니다. JSON 필드가 Java 필드 데이터 유형과 일치하는지 확인하세요.

 

 

해결

@RequesBody에는 String을 통해서 Json데이터를 받는것은 권장되지만 long, Long등의 타입은 권장되지 않는다고 한다. 그래서 Map을 이용해서 데이터를 받았더니 정상적으로 받을수있었다.

   @DeleteMapping("/delete/{question-id}")
    public ResponseEntity deleteQuestion(@PathVariable("question-id") Long questionId,
                                         @RequestBody Map<String, Long> data){
        Long userId = data.get("userId");
        questionService.deleteQuestion(questionId, userId);

        return new ResponseEntity(HttpStatus.NO_CONTENT);
    }

 

반응형