inflearn logo
강의

Course

Instructor

Spring Web MVC

Handler Method Part 15 @RequestBody & HttpEntity

@RequestBody의 바인딩에러를 잡는 방법

Resolved

1655

woajun2596

3 asked

1

안녕하세요 기선님, 좋은 강의를 해주셔서 감사합니다.

다름이 아니라, 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;
	}
	
}

java MVC spring

Answer 2

2

whiteship

안녕하세요. 좋은 질문이네요.

조금 어려운 이슈인데, 이 이슈는 안타깝게도 현재 @RequestBody로는 해결할 수 없습니다.

https://github.com/spring-projects/spring-framework/issues/11406

이 링크에 보이는 마지막 두개의 댓글만 읽으시면 이해하실 수 있을텐데요. 바인딩을 하는 주체가 스프링이면 int 값을 받아야 하는데 문자열을 받은 경우에도 BindingResult로 넣어줄 수 있겠지만, @RquestBody는 Jackson이나 Gson같은 외부 라이브러리가 그런 일을 담당하고 거기선 일반적인 에러만 던져주기 때문에 @ModelAttribute와 동일하게 처리하긴 어려운 것으로 보입니다.

대신 바인딩이 가능한 값이라면 @Valid와 함께 사용해서 Event라는 모델에 사용하는 JSR-303 애노테이션으로 추가적인 검증 작업은 가능합니다.

감사합니다.

0

woajun2596

링크와 답변을 통해 @ModelAttribute와 @RequestBody에 대해 좀 더 깊게 이해하게 된 것 같습니다.

좋은 답변을 해주셔서 감사합니다.

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