【问题标题】:Naming Spring page keys in HATEOAS _embedded PagedResource在 HATEOAS _embedded PagedResource 中命名 Spring 页面键
【发布时间】:2015-11-30 18:34:53
【问题描述】:

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

使用 Spring boot 1.2.5.RELEASE + 提供的 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,这些页面正在适当地生成。设置上一页/下一页的链接。 'embeddable' 属性正在生成,但随后我们在第一页得到“userList”:[{user}],第二页得到“user$$_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
  }
}

【问题讨论】:

  • 通过使用 Spring HATEOAS 包中的 @Relation 解决了该问题。 IE。 @Relation(collectionRelation = "用户")
  • 随意回答您自己的问题,并提供详细信息以使其对其他人有用!

标签: java spring spring-boot spring-hateoas


【解决方案1】:

据我了解作者自己对该问题的评论,找到的解决方案是将 @Relation(collectionRelation = "users") 添加到 User 类中。

...
@Table(name = "users")
@Relation(collectionRelation = "users")
public class User {
...

【讨论】:

  • 完美!对我来说,它作为 DTO 类的符号。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2020-05-11
  • 2015-04-29
  • 2015-02-08
  • 2016-10-15
  • 2015-03-22
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多