특정한 타입의 데이터를 담고 있는 요청만 처리하는 핸들러
기존 코드
@Controller
public class SampleController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
return "hello";
}
}
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void helloTest() throws Exception{
mockMvc.perform(get("/hello"))
.andDo(print())
.andExpect(status().isOk());
}
}
핸들러가 json을 보내는 경우만 요청을 처리하고 싶다.
@Controller
public class SampleController {
// @RequestMapping(value = "/hello", consumes = "applications/json")
@RequestMapping(value="/hello", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String hello(){
return "hello";
}
}
문자열로 입력하면 에러가 날 소지가 많으므로 문자열을 입력하는 대신 MediaType을 사용하면 상수를 (IDE에서) 자동 완성으로 사용할 수 있다.
Content-Type 헤더가 요청 본문이 어떤 형식의 데이터인지 알려준다.
테스트 코드
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void helloTest() throws Exception{
mockMvc.perform(get("/hello")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk());
}
}
특정한 타입의 응답을 만드는 핸들러
요청을 보내는 쪽에서 Accept 헤더를 설정할 수 있다.
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void helloTest() throws Exception{
mockMvc.perform(get("/hello")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk());
}
}
만약 plain text를 produce하겠다고 명시하면 테스트는 실패한다.
@Controller
public class SampleController {
@RequestMapping(value="/hello",
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
produces = MediaType.TEXT_PLAIN)
@ResponseBody
public String hello(){
return "hello";
}
}
클래스에 선언한 @RequestMapping에 사용한 것과 조합이 되지 않고 메소드에 사용한 @RequestMapping의 설정으로 덮어쓴다.
@Controller
@RequestMapping(consumes = MediaType.APPLICATION_XML_VALUE)
public class SampleController {
@RequestMapping(value="/hello",
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
produces = MediaType.TEXT_PLAIN)
@ResponseBody
public String hello(){
return "hello";
}
}
URL value와 달리, 서로 조합되는 관계가 아니라 메소드가 클래스의 설정을 오버라이딩 한다. 따라서 클래스의 설정은 적용되지 않고 메소드의 설정만 적용된다.
Not (!)을 사용해서 특정 미디어 타입이 아닌 경우로 맵핑 할 수도 있다.
참고