스프링 웹 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]





© 2019. by jaeuk