当前位置: 首页 > 知识库问答 >
问题:

Spring Boot数据Rest,帽子不与自定义控制器一起工作

赵立果
2023-03-14

我在Spring boot data rest中使用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但没有帮助。我想知道是否有另一种方法可以将“注册日期”放入新创建的对象中,而无需实现自己的自定义控制器?如果没有,我可以做什么HATEOAS才能再次工作?

共有1个答案

姜育
2023-03-14

我解决了我的问题,多亏了给我一个视角的评论:)

1 - 具有资源支持功能的扩展用户类。(注意:不要只使用 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"
            }
        ]
    },
    {
      ....
 类似资料:
  • 自定义路由 easySwoole支持路由拦截。其路由利用fastRoute实现,因此其路由规则与其保持一致,该组件的详细文档请参考 GitHub文档 路由定义 若需要再easySwoole使用路由拦截功能,请在应用目录(默认为App)下,建立Router类,井继承Core\AbstractInterface\AbstractRouter实现addRouter方法,如果在类UNIX系统下请严格注意文

  • 本文向大家介绍C#画笔Pen绘制自定义线的帽子,包括了C#画笔Pen绘制自定义线的帽子的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#画笔Pen绘制自定义线的帽子。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我试图向RepositoryRestResource中自动生成的endpoint添加一些额外的业务逻辑。请参见下面的代码: 资源: 控制器: 我看过下面两篇stackoverflow的文章: 我可以让自定义控制器镜像Spring-Data-Rest / Spring-Hateoas生成的类的格式吗? 在自定义控制器方法的 Spring Boot 中启用 HAL 序列化 我觉得我很接近了,但我面临的

  • easySwoole支持REST风格开发。在实现上,其实是对AbstractController进行了REST规则封装,本质上,也是一个控制器。 支持GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。 实例代码 namespace AppControllerRest; use CoreAbstractInterfaceAbstractREST; use CoreHttp

  • 嗨,我用spring初始化器创建了一个简单的Spring Boot应用程序。我在主应用程序类的同一文件夹中添加了一个控制器。 这是给我以下错误的网址http://localhost:8080/welcome 此应用程序没有针对/错误的显式映射,因此您将其视为回退。 Sat Dec 19 12:51:44 IST 2020出现意外错误(类型=未找到,状态=404)。 如果我使用@restContro