@RequestBody의 바인딩에러를 잡는 방법
안녕하세요 기선님, 좋은 강의를 해주셔서 감사합니다.
다름이 아니라, event 의 limit을 integer가 아닌 string으로 요청을 보냈을 때,
@ModelAttribute 로 요청 파라미터로 보낼 때는 데이터바인딩 에러를 감지해서 BindingResult에 에러가 담겼는데,
@RequestBody 로 요청 바디로 보낼때는 BindingResult에 에러가 담기지 않고, 400 에러를 발생시켰습니다.
제 예상으로는 HttpMessageConverter에서 데이터 변환을 할 때 발생하는 에러는 BindingResult에 담기지 않는 것 같은데, 이러한 바인딩 에러를 핸들러에서 받아서 처리할 수 있는 방법이 있을까요?
그리고 @RequestBody와 함께 사용하는 BindingResult는 Validation 체크에 대한 에러만 담기는 건지 궁금합니다.
==테스트 코드==
@RestController
public class TestController {
@PostMapping("/events/ma")
public Event maEvent(@ModelAttribute Event event, BindingResult bindingResult) {
return event;
}
@PostMapping("/events/rb")
public Event rbEvent(@RequestBody Event event, BindingResult bidningResult) {
return event;
}
}
==============
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class TestControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void createEvent() throws Exception {
String json = "{\"name\":\"juni\",\"limit\":\"juni\"}";
mockMvc.perform(post("/events/rb")
.contentType(MediaType.APPLICATION_JSON)
.content(json))
.andDo(print())
.andExpect(status().isBadRequest())
;
System.out.println("===============================");
mockMvc.perform(post("/events/ma")
.param("name", "juni")
.param("limit", "juni"))
.andDo(print())
.andExpect(status().isOk())
;
}
}
=====================
public class Event {
private String name;
private Integer limit;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
}
Answer 2
2
안녕하세요. 좋은 질문이네요.
조금 어려운 이슈인데, 이 이슈는 안타깝게도 현재 @RequestBody로는 해결할 수 없습니다.
https://github.com/spring-projects/spring-framework/issues/11406
이 링크에 보이는 마지막 두개의 댓글만 읽으시면 이해하실 수 있을텐데요. 바인딩을 하는 주체가 스프링이면 int 값을 받아야 하는데 문자열을 받은 경우에도 BindingResult로 넣어줄 수 있겠지만, @RquestBody는 Jackson이나 Gson같은 외부 라이브러리가 그런 일을 담당하고 거기선 일반적인 에러만 던져주기 때문에 @ModelAttribute와 동일하게 처리하긴 어려운 것으로 보입니다.
대신 바인딩이 가능한 값이라면 @Valid와 함께 사용해서 Event라는 모델에 사용하는 JSR-303 애노테이션으로 추가적인 검증 작업은 가능합니다.
감사합니다.
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
안녕하세요 기선님 강의를 보다 서블릿에 궁금증이 생겨 질문 드립니다
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
294
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
petclinic에서 @ModelAttribute 관련 질문 드립니다.
0
180
1

