Post

[TroubleShooting] IllegalStateException, HttpMediaTypeNotSupportedException

IllegalStateException과 HttpMediaTypeNotSupportedException

[TroubleShooting] IllegalStateException, HttpMediaTypeNotSupportedException

1. IllegalStateException

java.lang.IllegalStateException: Cannot resolve parameter names for constructor

해결방법: DTO에 @NoArgsConstructor 넣기

  • 즉, 기본 생성자를 만들어준다.
  • @ModelAttribute는 기본 생성자로 객체를 만들고 값을 set하는 방식이다. 따라서, DTO에 기본 생성자가 존재해야 @ModelAttribute를 사용할 수 있다.


2. HttpMediaTypeNotSupportedException

1
2
3
4
5
6
7
8
9
@PostMapping
    public ResponseEntity<String> uploadPhoto(@RequestPart("file") MultipartFile file, @RequestBody PhotoRequest request) {
        try {
            UUID id = UUID.fromString(request.getId());
            ...
        } catch (Exception e) {
            return ResponseEntity.badRequest().body("Failed to upload file: " + e.getMessage());
        }
    }

위의 uploadPhoto 메소드를 실행했더니 다음과 같은 오류가 발생했다.

1
2
3
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException:
Content-Type 'multipart/form-data;boundary=--------------------------440780948424522369548408;
charset=UTF-8' is not supported]


해결방법: @RequestBody를 @ModelAttribute로 변경하고, MultipartFile 을 PhotoRequest 의 매개변수로 넣는다.

  • 파일 업로드와 함께 JSON 데이터를 동시에 처리하는 요청을 보낼 때 @RequestBody를 통해 데이터를 받을 수 없다.
  • @RequestBody는 HTTP 요청 본문을 하나의 JSON 객체로 처리하는 반면, 파일 업로드는 multipart/form-data 형식을 사용하기 때문이다.

  • 반면 @ModelAttribute 는 multipart/form-data를 포함하여 모든 폼 데이터를 객체에 바인딩할 수 있는 메커니즘을 제공한다.
This post is licensed under CC BY 4.0 by the author.