study/springboot
009. controller pathvariable 처리
까오기
2022. 5. 12. 10:09
URI의 path를 다양한 형태로 매핑하는 예제를 만들어 봅니다.
java
@Slf4j
@RestController
@RequestMapping("/controller/path")
public class PathVariableAPIController {
/**
* 단순 매핑 테스트
* @return
*/
@GetMapping("/{id}")
public ResponseEntity<String> simple(@PathVariable String id) {
log(id);
return ResponseEntity.ok(id);
}
/**
* required false test
* @param id
* @return
*/
@GetMapping(value = { "/requiredfalse", "/requiredfalse/{id}"})
public ResponseEntity<String> requiredfalse(@PathVariable(required = false) String id) {
return simple(id);
}
/**
* optional test
* @param id
* @return
*/
@GetMapping(value = { "/optional", "/optional/{id}"})
public ResponseEntity<String> requiredfalseOptional(@PathVariable(required = false) Optional<String> id) {
String path = id.orElse("none");
log(path);
return ResponseEntity.ok(path);
}
/**
* pathVariable 복수개인 경우 테스트
* @param id
* @param name
* @return
*/
@GetMapping("/{id}/{name}")
public ResponseEntity<Map<String, String>> multiplePaths(@PathVariable String id, @PathVariable String name) {
Map<String, String> paths = new HashMap<>();
paths.put("id", id);
paths.put("name", name);
log(paths.toString());
return ResponseEntity.ok(paths);
}
/**
* pathVariable을 Map으로 받는 경우
* @param paths
* @return
*/
@GetMapping("/map/{id}/{name}")
public ResponseEntity<Map<String, String>> multipleMapPaths(@PathVariable Map<String, String> paths) {
log(paths.toString());
return ResponseEntity.ok(paths);
}
/**
* pathVariable을 Object로 받는 경우
* @param paths
* @return
*/
@GetMapping("/object/{id}/{name}")
public ResponseEntity<MappingParams> multipleObjectPaths(MappingParams paths) {
log(paths.toString());
return ResponseEntity.ok(paths);
}
private void log(String message) {
log.debug("path :" + message);
}
@Getter
@Setter
@ToString
public static class MappingParams {
private String id;
private String name;
}
}
test
@WebMvcTest(PathVariableAPIController.class)
class PathVariableAPIControllerTest {
@Autowired
private MockMvc mockMvc;
private static final String ROOT_URI = "/controller/path";
/**
* 매핑 테스트
* @throws Exception
*/
@ParameterizedTest
@CsvSource({
ROOT_URI+"/test,test"
, ROOT_URI+"/requiredfalse/test,test"
, ROOT_URI+"/requiredfalse,"
, ROOT_URI+"/optional/test,test"
, ROOT_URI+"/optional,none"
})
void simpleMapping(String uri, String expected) throws Exception {
MockHttpServletRequestBuilder mrbuilder = MockMvcRequestBuilders.get(uri).contentType(MediaType.APPLICATION_JSON);
if(expected == null) expected = "";
MvcResult result = mockMvc.perform(mrbuilder)
.andDo(print())
.andExpect(status().isOk())
.andReturn();
String content = result.getResponse().getContentAsString();
assertThat(content).isEqualTo(expected);
}
/**
* multiple path 테스트
* @throws Exception
*/
@ParameterizedTest
@CsvSource({
ROOT_URI+"/test/eblo,test,eblo"
, ROOT_URI+"/map/test/eblo,test,eblo"
, ROOT_URI+"/object/test/eblo,test,eblo"
})
void multiplePaths(String uri, String id, String name) throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get(uri)
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value(name))
.andExpect(jsonPath("$.id").value(id));
}
}