Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring returns Resource in pure JSON not in HAL Format when including spring data rest

When I use the default controller for my Entities, provided by Spring Data Rest everything works like it should. The output looks like this:

{
  "_links" : {
    "search" : {
      "href" : "http://localhost:8080/users/search"
    }
  },
  "_embedded" : {
    "users" : [ {
      "firstName" : "Max",
      "lastName" : "Mustermann",
      "email" : "[email protected]",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/users/myadmin"
        }
      }
    } ]
  }
}

But if I use my own Controller the output looks like this:

[ {
  "firstName" : "Max",
  "lastName" : "Mustermann",
  "email" : "[email protected]",
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost:8080/user/myadmin"
  } ]
} ]

My Controller

@RestController
@RequestMapping("/user")
@EnableHypermediaSupport(type = {HypermediaType.HAL})
public class UserController {

    @Autowired
    UserRepository userRepository;

    @RequestMapping(method=RequestMethod.GET)
    public HttpEntity<List<User>> getUsers(){
        ArrayList<User> users = Lists.newArrayList(userRepository.findAll());
        for(User user : users){
            user.add(linkTo(methodOn(UserController.class).getUser(user.getUsername())).withSelfRel());
        }
        return new ResponseEntity<List<User>>(users, HttpStatus.OK);
    }

    @RequestMapping(value="/{username}", method= RequestMethod.GET)
    public HttpEntity<User> getUser(@PathVariable String username){
        User user = userRepository.findByUsername(username);
        user.add(linkTo(methodOn(UserController.class).getUser(user.getUsername())).withSelfRel());
        return new ResponseEntity<User>(user, HttpStatus.OK);
    }
}

My User:

@Entity
@Table(name="users")
public class User extends ResourceSupport{
    @Id
    private String username;

    private String firstName;
    private String lastName;

    @JsonIgnore
    private boolean enabled;

    @JsonIgnore
    private String password;

    @Column(unique =  true)
    private String email;

    public User(){
        enabled = false;
    }
    //Getters and Setters
}

if i delete the spring data rest dependency and include spring-hateoas, spring-plugin-core and json-path (com.jayway.jsonpath) it works.. But i want to use spring-data-rest for some other entities

Two questions:

  1. Why isn't HAL the default with spring data rest included?
  2. How is it possible to set HAL as output format
like image 733
Yannic Klem Avatar asked Oct 19 '22 17:10

Yannic Klem


1 Answers

You need to return a subtype of ResourceSupport (usually Resource or Resources) to let the HAL Jackson converter kick in.

Also, @EnableHypermediaSupport has to be used on a JavaConfig configuration class, not the controller.

like image 95
Oliver Drotbohm Avatar answered Oct 22 '22 07:10

Oliver Drotbohm