백엔드

[Spring JPA] @ModelAttribute 사용 시 nullException 해결

콩지연 2023. 11. 21. 09:24

[@ModelAttribute 사용 시 nullException 해결]

 

1. 문제 발생

클라이언트에서 form-data형식으로 이미지(파일)과 값을 한 번에 보내는 요청이 있었다.

Controller를 아래처럼 작성하고 조회를 해보니 자꾸 요소 값이 null로 들어왔다.

 

- controller

@PostMapping(value = "", consumes = {"multipart/form-data"})
public DataResponse<CreateOpenAIResDto> askGPTSync(Principal principal, @ModelAttribute TalkReqDto talkReqDto) throws Exception {
    return openAIService.askGPTSync(principal, talkReqDto);
}

 

- TalkReqDto

@Getter
public class TalkReqDto {
    private Long talkId;
    private String prompt;
    private MultipartFile talkFile;
    private String language;
}

 

 

2.  원인

파일과 객체를 한 번에 요청을 보내려면 @RequestBody가 아닌 @ModelAttribute를 사용해야 한다.

@ModelAttribute  어노테이션은 주로 폼 데이터나 URL 쿼리 파라미터와 같은 "키-값" 쌍 데이터를
객체에 바인딩하는 데 사용된다.
Spring MVC는 이 데이터를 바인딩하기 위해 setter 메서드를 사용해 값을 읽기 위해서는 해당 객체에 setter 메서드가 있어야 한다.

 

3. 문제 해결

TalkReqDto에 @Setter를 붙여주니 문제가 해결되었다.

@Getter
@Setter
public class TalkReqDto {
    private Long talkId;
    private String prompt;
    private MultipartFile talkFile;
    private String language;
}