inflearn logo
강의

講義

知識共有

[改訂版2023-11-27] Spring Boot 3.xを利用したRESTful Web Servicesの開発

HATEOAS 질문

646

minsu

投稿した質問数 6

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-api spring-boot

回答 5

1

minsu

감사합니다!!

1

Dowon Lee

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

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

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

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

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

감사합니다.

1

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

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

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

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

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

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

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

감사합니다. 

0

alstkd1q1q2829

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

JPA

0

57

1

jpa dependency를 추가하고 SecurityConfig클래스에서 오류가 납니다.

0

68

1

웹 브라우저 400 bad request

0

70

1

@Size는 되는데 @Past는 안 됩니다.

0

61

1

pdf 자료는 없나요?

0

73

2

locale 정보가 null 이면 무조건 messages_ko.properties이 호출 되는 문제

0

87

2

Swagger 강의, Unable to infer base url 이거 뜨시는 분들 도움되시라고

0

118

1

강의에서나온 화면 피피티

0

158

1

HelloWorldBean 관련 에러

0

182

2

Swagger API 3.x 오류..

0

218

1

java: variable message not initialized in the default constructor 에러는 어찌하면 좋을까요?

1

282

1

현재 GIT에 올리신 소스를 실행해봤습니다.

0

188

2

고양이 소리가 귀엽네요 !!

0

137

2

git에서 소스받고 실습중인데

0

117

1

post가 안되요

0

102

1

한국어 같은 경우 언어코드인 messages_ko.properties 로 생성하는게 더 좋지 않나요?

0

167

2

리턴타입으로서 EntityModel<User> 와 ResponseEntity질문

0

103

1

예외처리쪽 관련 질문있습니다.

0

159

2

엔티티가 바로 응답으로 나가도 되나요??

0

220

2

안녕하세여 Cannot invoke "co.kr.joneconsulting.resfulservice.repository.PostRepository.save(Object)" because "this.postRepository" is null

0

135

2

사용자 등록하고 나서 H2 에서 보면 신규 사용자의 password, ssn 이 null 로 되어 있습니다.

0

140

2

ApplictionContext 질문

0

190

2

롬북이 안먹히는것같아요

0

156

1

인텔리제이에서스프링부트 파일 실행하면

0

239

1