Java:编译冲突:返回类型与HATEOAS ResourceSupport.getId不兼容

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实现此实体?

Ram*_*man 7

查看文档的"链接构建器"部分:

http://docs.spring.io/spring-hateoas/docs/current/reference/html/#fundamentals.obtaining-links.builder

在那里,它描述了如何使用a ControllerLinkBuilder来创建Link使用单独的控制器类.您的User对象将实现Identifiable<Long>,如上面页面中的示例所示.

  • 是的但我需要扩展ResourceSupport以获取.add(Link)方法 (2认同)

Nav*_*raj 5

您可以创建一个 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)