스프링 웹 MVC-24.@RequestBody & HttpEntity(핸들러 메소드)
핸들러 메소드 15부: @RequestBody & HttpEntity
@RequestBody
- 요청 본문(body)에 들어있는 데이터를 HttpMessageConveter를 통해 변환한 객체로 받아올 수 있다.
- @Valid 또는 @Validated를 사용해서 값을 검증 할 수 있다.
- BindingResult 아규먼트를 사용해 코드로 바인딩 또는 검증 에러를 확인할 수 있다.
HttpMessageConverter
- 스프링 MVC 설정 (WebMvcConfigurer)에서 설정할 수 있다.
- configureMessageConverters: 기본 메시지 컨버터 대체
- extendMessageConverters: 메시지 컨버터에 추가
- 기본 컨버터
- WebMvcConfigurationSupport.addDefaultHttpMessageConverters
HttpEntity
- @RequestBody와 비슷하지만 추가적으로 요청 헤더 정보를 사용할 수 있다.
참고
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestbody
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-httpentity
@RestController
@RequestMapping("/api")
public class EventApi {
@PostMapping
public Event createEvent(HttpEntity<Event> request){
// save event
MediaType contentType = request.getHeaders().getContentType();
System.out.println(contentType);
return request.getBody();
}
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@AutoConfigureMockMvc
class EventApiTest {
@Autowired
ObjectMapper objectMapper;
@Autowired
MockMvc mockMvc;
@Test
public void createEvent() throws Exception{
Event event = new Event();
event.setName("jaeuk");
event.setAge(27);
String json = objectMapper.writeValueAsString(event);
System.out.println(json);
mockMvc.perform(post("/api")
.contentType(MediaType.APPLICATION_JSON)
.content(json))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("name").value("jaeuk"))
.andExpect(jsonPath("age").value(27))
;
}
@PostMapping
public Event createEvent2(@RequestBody @Valid Event event, BindingResult bindingResult){
// save event
if(bindingResult.hasErrors()){
bindingResult.getAllErrors().forEach(error -> {
System.out.println("error ==========");
System.out.println(error);
});
}
return event;
}
{"id":0,"name":"jaeuk","age":-27}
error ==========
Field error in object 'event' on field 'age': rejected value [-27]; codes [Min.event.age,Min.age,Min.int,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [event.age,age]; arguments []; default message [age],0]; default message [must be greater than or equal to 0]