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

在HATEOAS_embedded PagedResource中命名Spring页面键

芮祺
2023-03-14

我们目前正在最新的项目中实现一个API库。我们正在尝试使用Spring HATEOAS和HAL作为适当的库来生成json HAL responsed。

使用Spring Boot1.2.5。释放提供的Spring HATEOAS版本。目前我们正在将实际的JPA实体映射为资源。

即,我们的实体如下所示:

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
@Table(name = "users")
public class User {

    @Id
    private UUID id;

    @Column(nullable = false, length = 70)
    private String firstName;

    @Column(nullable = false, length = 70)
    private String lastName;
}

我们的存储库:

public interface UserRepository extends PagingAndSortingRepository<User, UUID>, JpaSpecificationExecutor<User> {
    User findByUsername(String username);
}

我们的服务:

@Service
@Transactional
public class UserService implements UserDetailsService {

    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public Page<User> findAll(Pageable pageable) {
        return this.userRepository.findAll(pageable);
    }
}

RestController:

@RestController
@RequestMapping(value = "/users", produces =MediaType.APPLICATION_JSON_VALUE) // this is done otherwise objectmapper returns xml for some reason
public UserRestController {

    public UserService userService;
    public EntityLinks entityLinks;

    @Autowired
    public UserRestController(UserService userService, EntityLinks entityLinks) {
        this.userService = userService;
        this.entityLinks = entityLinks;
    }

    @RequestMapping(method = RequestMethod.GET)
    public PagedResource<Resource<User>> getUsers(Pageable pageable, PagedResourcesAssembler<User> pagedResourcesAssembler) {
        Page<User> userPage = this.userService.findAll(pageable);

        PagedResources<Resource<User>> userPagedResources =
            pagedResourcesAssembler.toResource(
                    usersPage,
                    linkTo(methodOn(UserRestController.class).showUsers(pageable, pagedResourcesAssembler)).withSelfRel());

        return userPagedResources;

    }
}

假设我将默认页面大小设置为1,则页面将正确生成。设置上一页/下一页的链接。正在生成“Embeddeble”属性,但我们在第一页得到“userList”:[{user}],第二页得到“user$$\u jvst163_9List”:[{user}]。

有没有一种方法可以真正命名页面列表属性(我一直在网上寻找一些东西,但没有用)。

例如:

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/users{?page,size,sort}",
      "templated": true
    },
    "next": {
      "href": "http://localhost:8080/users?page=1&size=1&sort=firstname,lastname,asc"
    }
  },
  "_embedded": {
    "userList": [{
      "id": "2027bea9-cfdc-4724-b29c-39b3f64cbfd5",
      "firstname": "admin",
      "lastname": "asdf",
    }]
  },
  "page": {
    "size": 1,
    "totalElements": 2,
    "totalPages": 2,
    "number": 0
  }
}
{
  "_links": {
    "self": {
      "href": "http://localhost:8080/users{?page,size,sort}",
      "templated": true
    },
    "prev": {
      "href": "http://localhost:8080/users?page=0&size=1&sort=firstname,lastname,asc"
    }
  },
  "_embedded": {
    "user_$$_jvst163_9List": [{
      "id": "52c0c09e-c386-4aec-9723-f8beaf99adc5",
      "username": "admin",,
      "firstname": "firstname",
      "lastname": "lastname"
    }]
  },
  "page": {
    "size": 1,
    "totalElements": 2,
    "totalPages": 2,
    "number": 1
  }
}

共有1个答案

邓阳伯
2023-03-14

据我所知,作者自己对这个问题的评论是,找到的解决方案是将@Relation(collectionRelation=“users”)添加到用户类中。

...
@Table(name = "users")
@Relation(collectionRelation = "users")
public class User {
...
 类似资料:
  • 构建MVC3解决方案进展顺利,但在浏览器中出现错误: 编译器错误消息:CS0234:命名空间“系统”中不存在类型或命名空间名称“Html”。网状物Mvc'(是否缺少部件引用?) 我已经用为解决方案安装了数据包,并为所有项目进行了设置。MVC3是否包含库System.网页。mvc.Ajax,等?为什么我得到了错误? 在References文件夹中,我有一个系统。网状物Mvc , 网状物配置 MSDN

  • 我最近发现了命名实体图,我正试图以一种干净、干燥的方式实现它们。 我不确定的是(通过JPA和Spring数据文档阅读还没有回答)使用的名称的范围。是它们所定义的类的私有,还是我可以这样做: 车站在哪里。Route中的深子图是指Stop中的命名实体图。 谢谢!

  • 我正在通过在此GitHub链接上分解三个相互连接的示例应用程序集来学习Spring OAuth2。这些应用程序在我的devbox上按预期工作,但应用程序会生成一个不需要的确认页面,要求用户确认他们授权的客户端接收其受保护的信息。确认页面的屏幕截图如下: 要删除确认步骤,需要对应用程序的代码进行哪些具体更改? 我知道确认页面在某些用例中可能很有用。但是确认页面不适合我心目中的用例,那么我该如何禁用此

  • 我在看一些旧代码,我试图重写它,但我遇到了一个问题。 这是运行良好的旧代码: 但是我使用的是Spring Data 2,其中的页面映射方法采用了一个函数而不是一个转换器,所以我不知道如何重写这个。 我读了这个主题:如何映射页面 有人能用SpringData2方法(Function而不是Converter)翻译上面的代码片段吗?

  • 字面值 使用字面值来创建不可变的 NSString, NSDictionary, NSArray, 和 NSNumber 对象。注意不要将 nil 传进 NSArray 和 NSDictionary 里,因为这样会导致崩溃。 例子: NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"]; NSDict

  • Spring Data Elasticsearch模块包含一个自定义的命名空间,它允许我们定义repository bean和初始化一个ElasticsearchServer。 下面,我们像创建Repository实例中描述的那样使用repositories元素查找Spring Data repository。 Example 32. Setting up Elasticsearch reposi