Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: compile conflict: return type is incompatible with HATEOAS ResourceSupport.getId

So I have this HATEOAS entity.

@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();
    }
}  

My entity has an id of type long, but HATEOAS's ResourceSupport requires that getId return a Link.

The entity has a Long id because the db has a long id, and it is a persisted entity. How can I implement this entity with HATEOAS?

like image 218
Lurk21 Avatar asked Jan 08 '14 01:01

Lurk21


2 Answers

Check out the "Link Builder" section of the documentation:

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

There, it describes how to use a ControllerLinkBuilder to create the Link using a separate controller class. Your User Object would implement Identifiable<Long>, as the example in the page above shows.

like image 112
Raman Avatar answered Nov 09 '22 06:11

Raman


You can create one BeanResource bean which extends ResourceSupport bean like.

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

 @JsonUnwrapped
 private Object resorce;

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

 public Object getResorce() {
    return resorce;
 }

}

just Unwrap resource instance property so that BeanResource bean will render json like user bean along with ResourceSupport bean will render link json object,

after that you can create assembler like this.

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;
}

}

and in controller just attach Resource bean which contains user bean like

@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);
}
like image 26
Naveen raj Avatar answered Nov 09 '22 08:11

Naveen raj