인프런 커뮤니티 질문&답변

minsu님의 프로필 이미지

작성한 질문수

[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발

HATEOAS 질문

작성

·

487

0

{
    "id"1,
    "name""Kenneth",
    "joinDate""2020-06-10T12:24:12.537+0000",
    "links": [
        {
            "rel""self",
            "href""http://localhost:8088/users/1",
            "hreflang"null,
            "media"null,
            "title"null,
            "type"null,
            "deprecation"null
        },
        {
            "rel""all-users",
            "href""http://localhost:8088/users",
            "hreflang"null,
            "media"null,
            "title"null,
            "type"null,
            "deprecation"null
        }
    ]
}
저는 강사님과 달리 이런식으로 NULL값이 들어있는 필드를 포함한 JSON 객체를 반환받는데, 왜 이렇게 되는 건가요??

답변 5

1

minsu님의 프로필 이미지
minsu
질문자

감사합니다!!

1

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다. 

질문란에 올라온 글이 아니라, 댓글에 등록된 질문이어서 확인하는데 오래 걸렸습니다. 죄송합니다. 

문의하신 내용에 대한 답변으로, 

MappingJacksonValue는 반환할 User 객체의 전체 데이터 중 일부만 반환하기 위한 Filter가 적용되어 있는데, MappingJacksonValue를 Resource로 감싸서 반환하게 되면 Filter를 적용할 수 없다는 오류가 발생하게 됩니다. 

따라서, Resource<MappingJacksonValue>로 반환하지 마시고, MappingJacksonValue로 반환하되, MappingJacksonValue를 생성하는 파라미터로 user데이터가 아닌, Resource<User>가 전달되면 filter된 값과 hateoas가 추가된 형태의 반환 값이 전달될 것입니다. 

감사합니다.

1

minsu님의 프로필 이미지
minsu
질문자

아하.. 답변 감사합니다!!

저는 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

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다. 

HATEOAS의 반환값은 Resource, Resources, PagedReources 중 하나의 형태이어야 하는데, 다른 형식으로 반환 되지 않았나 싶습니다. 혹시 해당 Controller에 구현된 메소드를 같이 올려주시면 추가 정보를 드릴 수 있을것 같습니다. 

아래 제 코드를 참고해 보시면, 

위와 같이 반환값이 LIST 형태일 경우에는 links와 같은 형태로 반환되고,

위와 같이 반환값이 Resources의 형태일 경우에는 _links로 반환 됩니다. 

links와 _links의 차이는 application /json과 applciation/hal-json 차이도 있기는 합니다. Resources를 반환값으로 하는 HAL-JSON 타입으로 반환하면 _links로 결과를 보실 수 있을거라 생각됩니다. 

감사합니다. 

0

저도 잘해결되었습니다!!! 

minsu님의 프로필 이미지

작성한 질문수

질문하기