강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của mu16160159
mu16160159

câu hỏi đã được viết

[Phiên bản sửa đổi 2023-11-27] Phát triển RESTful Web Services bằng Spring Boot 3.x

HATEOAS 질문

Viết

·

630

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 객체를 반환받는데, 왜 이렇게 되는 건가요??
rest-apispring-boot

Câu trả lời 5

1

minsu님의 프로필 이미지
minsu
Người đặt câu hỏi

감사합니다!!

1

Dowon Lee님의 프로필 이미지
Dowon Lee
Người chia sẻ kiến thức

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

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

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

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

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

감사합니다.

1

minsu님의 프로필 이미지
minsu
Người đặt câu hỏi

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

저는 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
Người chia sẻ kiến thức

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

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

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

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

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

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

감사합니다. 

0

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

Hình ảnh hồ sơ của mu16160159
mu16160159

câu hỏi đã được viết

Đặt câu hỏi