biuild.gradle 에 jackson 라이브러리를 추가해줘야한다.
implementation 'com.fasterxml.jackson.core:jackson-databind'
import com.fasterxml.jackson.annotation.JsonFilter;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Size;
import java.util.Date;
@Data
@AllArgsConstructor
@JsonFilter("UserInfo")
public class User {
private Integer id;
@Size(min=2)
private String name;
private Date joinDate;
private String password;
private String ssn;
}
도메인 객체에, 클래스레벨에 @JsonFilter를 부여하고, filter 네임을 지정한다.
이렇게 지정하면, 컨트롤러 레벨에서, filter를 시켜주지 않는 한, 데이터가 넘어가지 않는다.
적용후, 객체를 조회 했지만, 500에러와 함께, Cannot resolve PropertyFilter with id "UserInfo"; no FilterProvider configurerd
filter가 없으면 넘아가질 않는다.
@RestController
@RequestMapping("/admin") //클래스 레벨에서 @requestMappingd을 지정한면 prefix를 지정한 효과를 가진다.
public class AdminUserController {
private UserDaoService service;
public AdminUserController(UserDaoService service) {
this.service = service;
}
@GetMapping("/users")
public List<User> retrieveAllUsers() {
return service.findAll();
}
@GetMapping("/users/{id}")
//반환값은 MappingJacksonValue사용
public MappingJacksonValue retrieveUser(@PathVariable int id) {
User user = service.findOne(id);
if (user == null) {
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
// filter 생성, 넘길 필드명 작성
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
.filterOutAllExcept("id","name","joinDate","ssn");
//위에 필터를 사용할수있게 변경하는 과정,
// 첫번째 인자같은 domain @JsonFilter("UserInfo")의 Userinfo 문자열을 넘겨준다.
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo",filter);
// mapping에 객체 넣기
MappingJacksonValue mapping = new MappingJacksonValue(user);
// mapping을 filter로 거르기
mapping.setFilters(filters);
return mapping;
}
}
@RestController
@RequestMapping("/admin")
public class AdminUserController {
private UserDaoService service;
public AdminUserController(UserDaoService service) {
this.service = service;
}
@GetMapping("/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;
}
}
// List<T> 형식도 , 단일 객체와 똑같이 적용하면 잘 출력되는것을 확인 할수 있다.
'RESTful' 카테고리의 다른 글
Request Parameter 와 Header를 이용한 API 관리 (0) | 2022.01.16 |
---|---|
Rest API version 관리(URI) (0) | 2022.01.16 |
@JsonIgnore (jackson) (0) | 2022.01.16 |
Internationalization 다국어처리 (0) | 2022.01.15 |
Validation (0) | 2022.01.14 |