Spring Boot Data REST,HATEOAS不使用自定义Controller

时间:2016-04-25 12:00:54

标签: java spring rest spring-data-rest spring-hateoas

我在Spring启动数据中使用MongoRepository并且它正常工作而没有实现我自己的控制器。但我想把"注册日期"在我新创建的对象中,默认实现不支持。我需要实现自己的自定义控制器,以在每个新对象中添加额外的字段。问题是当我实现自己的控制器时,HATEOAS停止工作。

存储库类:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends MongoRepository<User, String> {
}

控制器类:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    UserRepository repository;

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<List<User>> getAll() {
        List<User> list = repository.findAll();
        return new ResponseEntity<>(list, HttpStatus.OK);
    }

使用此自定义控制器的有效负载如下所示:

[
    {
        "id": "571de80ebdabf25dd6cdfb73",
        "username": "mark",
        "password": "mark123",
        "email": "mark@gmail.com",
        "createdAt": "2016-04-25 11:49"
    },
    {
      ...

没有我的自定义控制器的有效负载如下所示:

{
    "_embedded": {
        "users": [
            {
                "username": "mark",
                "password": "mark123",
                "email": "mark@gmail.com",
                "createdAt": "2016-04-25 11:49",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/users/571de80ebdabf25dd6cdfb73"
                    },
                    "user": {
                        "href": "http://localhost:8080/users/571de80ebdabf25dd6cdfb73"
                    }
                }
            },
            {
             .....

我尝试使用@RepositoryRestController代替@RestController,但它没有帮助。我想知道是否有另一种方式可以注册&#34;注册日期&#34;在新创建的对象中没有实现自定义控制器?如果没有,我可以做什么HATEOAS再次工作?

1 个答案:

答案 0 :(得分:0)

由于给我一个观点的评论,我解决了我的问题:)

1 - 带有ResourceSupport的扩展用户类。 (注意:不要只使用id userId,因为ResourceSupport需要getId()方法。)

public class User extends ResourceSupport {

    @Id
    private String userId;

2 - 更新了我的控制器类,如下所示

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;

@RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<List<User>> getAll() {
        List<User> list = repository.findAll();
        for(User user : list) {
            Link self = linkTo(UserController.class).slash(user.getUserId()).withSelfRel();
            Link users = linkTo(UserController.class).slash(user.getId()).withRel("users");
            user.add(self);
            user.add(users);
        }
        return new ResponseEntity<>(list, HttpStatus.OK);
    }

现在,我的有效负载看起来像这样:

[
    {
        "userId": "571e44ecbdab7b1ffc668f02",
        "username": "newton",
        "password": "gravity",
        "email": "nevton@gmail.com",
        "createdAt": "2016-04-25 18:
        "links": [
            {
                "rel": "self",
                "href": "http://localhost:8080/users/571e44ecbdab7b1ffc668f02"
            },
            {
                "rel": "users",
                "href": "http://localhost:8080/users"
            }
        ]
    },
    {
      ....