【问题标题】:Java: compile conflict: return type is incompatible with HATEOAS ResourceSupport.getIdJava:编译冲突:返回类型与 HATEOAS ResourceSupport.getId 不兼容
【发布时间】:2014-01-25 22:52:41
【问题描述】:

所以我有这个 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();
    }
}  

我的实体有一个 long 类型的 id,但 HATEOAS 的 ResourceSupport 要求 getId 返回一个链接。

实体有一个 Long id,因为 db 有一个 long id,它是一个持久化实体。如何使用 HATEOAS 实现这个实体?

【问题讨论】:

  • 我自己刚刚开始玩 Spring HATEOAS,但我的理解是 ResourceSupport 应该是 DTO 而不是活实体。
  • 哦。这是有道理的

标签: java spring rest jpa spring-hateoas


【解决方案1】:

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

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

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

【讨论】:

  • 是的,但我需要扩展 ResourceSupport 以获得 .add(Link) 方法
  • ResourceSupport 的 javadoc 说“DTO 收集链接的基类”。所以,@chrylis 上面的评论似乎是正确的。您的实体不应该是您的 ResourceSupport 实现。无论如何,这将是一团糟——您最终会在您的数据库中拥有ResourceSupport 中的“链接”ArrayList
  • 是的,这正是我的困惑。我现在明白了,我完全错过了阅读中的 DTO 部分。谢谢!
【解决方案2】:

您可以创建一个扩展 ResourceSupport bean 的 BeanResource bean。

@JsonIgnoreProperties({ "id" })
public class BeanResource extends ResourceSupport {

 @JsonUnwrapped
 private Object resorce;

 public Resource(Object resorce) {
    this.resorce = resorce;
 }

 public Object getResorce() {
    return resorce;
 }

}

只需解开资源实例属性,这样 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;
}

}

并且在控制器中只附加包含用户 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);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2016-05-28
  • 2015-10-21
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多