public class Member {
private Integer id;
private String name;
//setter,getter 생략
}
3) MemberModel.java
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import org.springframework.hateoas.RepresentationModel;
public class MemberModel extends RepresentationModel<MemberModel> {
public MemberModel(Member member) {
this.member = member;
}
@JsonUnwrapped
private final Member member;
}
hateoas 기능을 사용하려면 RepresentationModel 클래스를 상속받은 클래스를 구현해야합니다. 멤버변수로 hateoas를 적용할 클래스를 선언해주면 됩니다.
@JsonUnwrapped 어노테이션을 사용하면 member 반환 시 member depth를 없애고 member의 멤버변수를 바로 출 력 받을 수 있습니다.
4) MemberController.java
import org.springframework.hateoas.MediaTypes;
import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.URI;
import java.util.IdentityHashMap;
import java.util.Map;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
@RestController
@RequestMapping(value = "/api/member", produces = MediaTypes.HAL_JSON_VALUE)
public class MemberController {
private Map<Integer, Member> db = new IdentityHashMap<>();
private Integer id = 1;
@PostMapping
public ResponseEntity createMember(@RequestBody Member member) {
member.setId(id++);
/*
/api/member
*/
WebMvcLinkBuilder listLink= linkTo(MemberController.class);
/*
/api/member/{id}
*/
WebMvcLinkBuilder selfLink = listLink.slash(member.getId());
//hateoas model 객체 생성
MemberModel memberModel = new MemberModel(member);
//list link
memberModel.add(listLink.withRel("list"));
//self link
memberModel.add(selfLink.withSelfRel());
//update link
memberModel.add(selfLink.withRel("update"));
return ResponseEntity.created(selfLink.toUri()).body(memberModel);
}
}
POST /api/member 요청 시 HAL_JSON 방식으로 리소스를 반환합니다.
반환 정보는 생성된 Member 정보와 Member와 관련된 링크 정보로 구성됩니다. 링크 정보는 list, self, update 정보를 담고 있습니다.
( HAL이란 Hypertext Application Language의 약자로 JSON 또는 XML 코드 내의 외부 리소스에 대한 링크와 같은 하이퍼 미디어를 정의하기 위한 표준 규칙입니다. )
3. 테스트
Request URL : POST http://localhost:8080/api/member content-type : application/hal+json body : {"name":"kim"}