[英]Java: compile conflict: return type is incompatible with HATEOAS ResourceSupport.getId
所以我有這個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();
}
}
我的實體的id類型為long,但HATEOAS的ResourceSupport要求getId返回一個Link。
實體具有Long id,因為db具有long id,並且它是持久化實體。 如何使用HATEOAS實現此實體?
查看文檔的“鏈接構建器”部分:
在那里,它描述了如何使用ControllerLinkBuilder
使用單獨的控制器類創建Link
。 您的User
對象將實現Identifiable<Long>
,如上頁中的示例所示。
您可以創建一個擴展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的Resource 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.