@Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
private String name;
@Past
private Date joinDate;
@Size
: name변수는 최소 2글자 이상이여야 하고, 유효성 실패 메세지를 따로 지정함@Past
: joinDate변수는 과거 시간만 사용해야 함@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user){}
@Valid
: 유효성을 검사해야 하는 변수 앞에 선언@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status,
WebRequest request)
{
ExceptionResponse exceptionResponse =
new ExceptionResponse(new Date(), "validation Failed", ex.getBindingResult().toString());
return new ResponseEntity(exceptionResponse, HttpStatus.BAD_REQUEST);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(value={"password", "ssn"})
public class User {
private Integer id;
@Size(min=2, message="Name은 2글자 이상 입력해 주세요.")
private String name;
@Past
private Date joinDate;
// @JsonIgnore
private String password;
// @JsonIgnore
private String ssn;
}
@JSonIgnore
@JsonIgnoreProperties(value={"~"})
@JsonIgnore
와 달리 클래스 블록에 선언value
값에 노출하기 싫은 필드명들 기입 @Data
@AllArgsConstructor
@NoArgsConstructor
@JsonFilter("UserInfo") //"UserInfo"라는 이름부여
public class User {
private Integer id;
@Size(min=2, message="Name은 2글자 이상 입력해 주세요.")
private String name;
@Past
private Date joinDate;
private String password;
private String ssn;
}
@RestController
@RequestMapping("/admin")
public class AdminUserController {
private UserDaoService service;
public AdminUserController(UserDaoService service) {
this.service = service;
}
@GetMapping("/users") // /admin/users
public MappingJacksonValue retrieveAllUsers() {
List<User> users = service.findAll();
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
.filterOutAllExcept("id", "name", "joinDate", "ssn");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter);
MappingJacksonValue mapping = new MappingJacksonValue(users);
mapping.setFilters(filters);
return mapping;
}
@GetMapping("/users/{id}") // /admin/users/{id}
public MappingJacksonValue retrieveUser(@PathVariable int id) {
User user = service.findOne(id);
if(user == null) {
throw new UserNotFoundException(String.format("ID[%s] not found", id));
}
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
.filterOutAllExcept("id", "name", "joinDate", "ssn");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter);
MappingJacksonValue mapping = new MappingJacksonValue(user);
mapping.setFilters(filters);
return mapping;
}
}
//UserV2 class
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonFilter("UserInfoV2")
public class UserV2 extends User { // User Domain 상속
private String grade;
}
// GET /admin/users/1 -> /admin/v1/users/1
@GetMapping("/v1/users/{id}")
public MappingJacksonValue retrieveUserV1(@PathVariable int id) {
User user = service.findOne(id);
if(user == null) {
throw new UserNotFoundException(String.format("ID[%s] not found", id));
}
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
.filterOutAllExcept("id", "name", "joinDate", "ssn");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter);
MappingJacksonValue mapping = new MappingJacksonValue(user);
mapping.setFilters(filters);
return mapping;
}
// /admin/v2/users/1
@GetMapping("/v2/users/{id}")
public MappingJacksonValue retrieveUserV2(@PathVariable int id) {
User user = service.findOne(id);
if(user == null) {
throw new UserNotFoundException(String.format("ID[%s] not found", id));
}
UserV2 userV2 = new UserV2();
BeanUtils.copyProperties(user, userV2); // BeanUtils: Bean들간의 작업을 도와주는 class, user를 userV2로 복사
userV2.setGrade("VIP");
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
.filterOutAllExcept("id", "name", "joinDate", "grade");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfoV2", filter);
MappingJacksonValue mapping = new MappingJacksonValue(userV2);
mapping.setFilters(filters);
return mapping;
}
(1) Request Parameter 이용
//@GetMapping("/v1/users/{id}") //URI
@GetMapping(value = "/users/{id}/", params = "version=1") //parameter
public MappingJacksonValue retrieveUserV1(@PathVariable int id){}
Get admin/users/1/?version=1
(2) Request Header 이용
//@GetMapping("/v1/users/{id}") //URI
@GetMapping(value = "/users/{id}", headers="X-API-VERSION=1") //header
public MappingJacksonValue retrieveUserV1(@PathVariable int id){}
Get admin/users/1
, Request Header에 Key: X-API-VERSION, Value: 1 입력(3) MIME타입 이용
//@GetMapping("/v1/users/{id}") //URI
@GetMapping(value = "/users/{id}", produces = "application/vnd.company.appv1+json")
public MappingJacksonValue retrieveUserV1(@PathVariable int id){}
Get admin/users/1
, Request Header에 Key: Accept, Value: application/vnd.company.appv1+json 입력