Lur*_*k21 8 java rest spring jpa spring-hateoas
所以我有这个HATEOAS实体.
@Entity
@Table(name="users")
public class User extends ResourceSupport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private long id;
public User() {
}
public Long getId() {
return new Long(id);
}
public void setId(Long id) {
this.id = id.longValue();
}
}
Run Code Online (Sandbox Code Playgroud)
我的实体的id类型为long,但HATEOAS的ResourceSupport要求getId返回一个Link.
实体具有Long id,因为db具有long id,并且它是持久化实体.如何使用HATEOAS实现此实体?
查看文档的"链接构建器"部分:
在那里,它描述了如何使用a ControllerLinkBuilder来创建Link使用单独的控制器类.您的User对象将实现Identifiable<Long>,如上面页面中的示例所示.
您可以创建一个 BeanResource bean,它扩展 ResourceSupport bean 之类的。
@JsonIgnoreProperties({ "id" })
public class BeanResource extends ResourceSupport {
@JsonUnwrapped
private Object resorce;
public Resource(Object resorce) {
this.resorce = resorce;
}
public Object getResorce() {
return resorce;
}
}
Run Code Online (Sandbox Code Playgroud)
只需解包资源实例属性,以便 BeanResource bean 将像用户 bean 一样呈现 json,而 ResourceSupport bean 将呈现链接 json 对象,
之后,您可以像这样创建汇编程序。
public class UserAssembler extends ResourceAssemblerSupport<User, BeanResource> {
public UserAssembler() {
super(User.class, BeanResource.class);
}
@Override
public Resource toResource(User user) {
Resource userResource = new Resource(user);
try {
Link selfLink = linkTo(
methodOn(UserController.class).getUser(user.getId()))
.withSelfRel();
userResource.add(selfLink);
} catch (EntityDoseNotExistException e) {
e.printStackTrace();
}
return userResource;
}
}
Run Code Online (Sandbox Code Playgroud)
并在控制器中只附加包含用户 bean 的资源 bean,如
@RequestMapping(value = "/user/{userId}", method = RequestMethod.GET)
public ResponseEntity<Resource> getUser(@PathVariable String userId)
throws EntityDoseNotExistException {
User user = userService.getUser(userId);
Resource userResource = userAssembler.toResource(user);
return new ResponseEntity<Resource>(userResource, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5121 次 |
| 最近记录: |