작성
·
506
0
답변 5
1
1
안녕하세요, 이도원입니다.
질문란에 올라온 글이 아니라, 댓글에 등록된 질문이어서 확인하는데 오래 걸렸습니다. 죄송합니다.
문의하신 내용에 대한 답변으로,
MappingJacksonValue는 반환할 User 객체의 전체 데이터 중 일부만 반환하기 위한 Filter가 적용되어 있는데, MappingJacksonValue를 Resource로 감싸서 반환하게 되면 Filter를 적용할 수 없다는 오류가 발생하게 됩니다.
따라서, Resource<MappingJacksonValue>로 반환하지 마시고, MappingJacksonValue로 반환하되, MappingJacksonValue를 생성하는 파라미터로 user데이터가 아닌, Resource<User>가 전달되면 filter된 값과 hateoas가 추가된 형태의 반환 값이 전달될 것입니다.
감사합니다.
1
아하.. 답변 감사합니다!!
저는 JsonFilter 적용시켜보고 싶어서 아래처럼 코드를 짯는데 다른 방법이 있을까요???
Resorce<MappingJacksonValue> 를 반환값으로 하려니까 오류가 나더라구요..
@GetMapping("/users/{id}")
public ResponseEntity<MappingJacksonValue> retrieveUser(@PathVariable int id, HttpServletRequest request){
User user = service.findOne(id);
if(user == null) {
throw new UserNotFoundException(String.format("ID[%s] not found", id));
}
// HATEOAS
//retrieveAllUsers 메소드(/users)를 "all-user" 와 연결
Resource<User> resource = new Resource<>(user);
/*
ControllerLinkBuilder linkTo = ControllerLinkBuilder.linkTo(
ControllerLinkBuilder.methodOn(this.getClass()).retrieveAllUsers());
*/
resource.add(new Link(request.getRequestURL().toString()).withSelfRel());
resource.add(linkTo(methodOn(UserController.class).retrieveAllUsers()).withRel("all-users"));
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
//아래의 필드들을 가져온다. JsonIgnore 되어있는 경우 가져오지 않음.
.filterOutAllExcept("id", "name", "joinDate");
FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter);
MappingJacksonValue mapping = new MappingJacksonValue(resource);
mapping.setFilters(filters);
return ResponseEntity.ok(mapping);
}
1
안녕하세요, 이도원입니다.
HATEOAS의 반환값은 Resource, Resources, PagedReources 중 하나의 형태이어야 하는데, 다른 형식으로 반환 되지 않았나 싶습니다. 혹시 해당 Controller에 구현된 메소드를 같이 올려주시면 추가 정보를 드릴 수 있을것 같습니다.
아래 제 코드를 참고해 보시면,
위와 같이 반환값이 LIST 형태일 경우에는 links와 같은 형태로 반환되고,
위와 같이 반환값이 Resources의 형태일 경우에는 _links로 반환 됩니다.
links와 _links의 차이는 application /json과 applciation/hal-json 차이도 있기는 합니다. Resources를 반환값으로 하는 HAL-JSON 타입으로 반환하면 _links로 결과를 보실 수 있을거라 생각됩니다.
감사합니다.
0