@RequestBody와 @ModelAttribute
445
작성한 질문수 21
안녕하세요, 수업 잘 보고 있습니다.
저는 Controller에서 RequestMapping을 할 때 습관적으로 @ModelAttribute를 적어주는데요,
Client단에서 JSON으로 요청을 보냈을 때,
@RequestBody와 함께 @ModelAttribute를 적으면 제대로 바인딩이 안되는 경험을 했습니다.
@RequiredArgsConstructor
@RestController
public class NotificationController {
private final NotificationService notificationService;
private final NotificationDeleteRequestDtoValidator notificationDeleteRequestDtoValidator;
@InitBinder("notificationDeleteRequestDto")
public void initBinderForNotificationDeleteRequestDtoValidator(WebDataBinder webDataBinder){
webDataBinder.addValidators(notificationDeleteRequestDtoValidator);
}
@PostMapping(NOTIFICATION_DELETE_URL)
public ResponseEntity deleteNotification(@SessionAccount Account sessionAccount,
@Valid @RequestBody @ModelAttribute NotificationDeleteRequestDto notificationDeleteRequestDto,
Errors errors){
if(errors.hasErrors()){
return ResponseEntity.badRequest().build();
}
// notificationService.deleteNotification(sessionAccount, notificationDeleteRequestDto);
return ResponseEntity.ok().build();
}
}
이렇게 하면 바인딩이 안되어 null값으로 들어오고,
@RequiredArgsConstructor
@RestController
public class NotificationController {
private final NotificationService notificationService;
private final NotificationDeleteRequestDtoValidator notificationDeleteRequestDtoValidator;
@InitBinder("notificationDeleteRequestDto")
public void initBinderForNotificationDeleteRequestDtoValidator(WebDataBinder webDataBinder){
webDataBinder.addValidators(notificationDeleteRequestDtoValidator);
}
@PostMapping(NOTIFICATION_DELETE_URL)
public ResponseEntity deleteNotification(@SessionAccount Account sessionAccount,
@Valid @RequestBody NotificationDeleteRequestDto notificationDeleteRequestDto,
Errors errors){
if(errors.hasErrors()){
return ResponseEntity.badRequest().build();
}
// notificationService.deleteNotification(sessionAccount, notificationDeleteRequestDto);
return ResponseEntity.ok().build();
}
}
이렇게 하면 바인딩이 잘 되더군요..
@ModelAttribute는 @RequestBody와 같이 쓰면 안되는건가요 원래?
아니면 제가 뭔가 잘못한 게 있는건가요?
답변 4
0
아 아니네요..
@PathVariable은 주소에 URI로 들어오지만
@RequestParam은 POST요청의 경우 본문에 들어오니까..
결국 @ModelAttribute는 요청 매개변수형태(key=value)는 쿼리파라미터든 본문이든 모두 매핑이 되지만, JSON형태는 매핑이 안되는 거군요?
0
@ModelAtteibute는 @PathVariable이나 @RequestParam으로 들어오는 값들만 매핑이 돼서,
@RequestBody로 들어오는, 즉 JSON형태로 요청 body 본문에 들어오는 내용은 매핑을 못하는 것 같은데.. 맞나요??
7:58 예제 코드 찾는 법
0
256
2
PATCH의 Idempotent에 대한 질문
0
257
1
2:51초 질문입니다.
0
324
1
만약 어플리케이션컨텍스트에 필터를 설정하지 않으면 어떻게되나요?
0
361
0
web.xml에 위치한 애플리케이션 web.xml 내에서 파싱 오류 발생
0
515
0
Spring Boot 2.6 이상 버전에서의 DispatcherServlet
0
366
1
Event`Xxx`Controller 분리할때의 기준에 관한 질문입니다.
0
634
1
11분 57초 쯤, `returnValueHandlers` 들의 네이밍컨벤션 관련 질문입니다.
0
379
1
@EnableWebmvc 설정을 하면
0
415
1
springframework와의 차이점
0
283
1
@RequestBody의 바인딩에러를 잡는 방법
1
1655
2
안녕하세요 기선님 강의를 보다 서블릿에 궁금증이 생겨 질문 드립니다
1
237
1
HelloService의 값을 전달을 못 받습니다.
0
296
1
ServletContext와 WebApplicationContext의 관계 질문
1
740
1
하나의 서비스에, 두개의 리포지토리도 연결이 되나요?
0
364
1
view name 리턴에 대해
0
290
2
Formatter print 질문 드립니다.
0
232
1
에리 메시지가 한글입니다.
0
293
1
java 클래스파일로 설정되어 있던 것을 web.xml로 바꾸는 경우
0
338
1
@RequestParam
0
255
1
@Retention 질문
0
229
1
Event.builder() 관련 mac에서 lombok 문제 있으신 분들
0
198
1
스프링 부트 사용시 WebMvcConfigurerSupport 클래스
0
252
1
http://localhost:8080/hello 입력시 오류
0
492
4





