gpt4 book ai didi

java - Spring Pageable 排序暴露了 dao 的内部命名

转载 作者:行者123 更新时间:2023-12-01 11:19:45 26 4
gpt4 key购买 nike

我正在使用 Spring 和 Spring Repositories 构建休息微服务。我想让客户端控制分页和排序(使用 spring-data-rest)。

public PagedResources<TestDto> find(
@PageableDefault(page = 0, size = 50) final Pageable pageable,
final PagedResourcesAssembler<Test> assembler) {

final Page<Test> pagedResults = testRepository.findAll(pageable);

return assembler.toResource(pagedResults, testResourceAssembler);
}

上面的代码效果很好,除了我不高兴排序是耦合到我的 dao 层而不是 dto 层。例子:
http://localhost:8080/my-service/test?size=100&page=0&sort=statusCode,asc

json 响应(DTO):
{
"links": [
...
...
],
"content": [
{
"id": 4
"status": "OK"
"links": []
}
],
"page": {
"size": 100,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}

请注意请求 url 中的“statusCode”排序与响应 dto 中相应的“status”之间的区别。从客户的角度来看,这不合逻辑。现在我也暴露了一些服务的内部信息。我无法更改服务的实现,因为它可以被客户端使用,并且在更改名称后会破坏旧的请求。

当我添加自定义映射来处理搜索请求中的不同状态码与状态时:
private PageRequest getPageRequest(final Pageable pageable) {
final List<Order> newOrder = new ArrayList<>();
for (final Order order : pageable.getSort()) {
if (daoToJpaMapping.containsKey(order.getProperty())) {
newOrder.add(new Order(order.getDirection(), daoToJpaMapping.get(order.getProperty())));
} else {
throw new OngeldigSortProperty(order.getProperty() + " is niet toegestaan als sorteerproperty");
}
}
final PageRequest pageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by(newOrder));

return pageRequest;
}

它对我的 hal 响应适得其反,因为它包含基于 jpa 名称的完整 url:
{
"links": [
{
"rel": "first",
"href": "http://localhost:8080/my-service/test?page=0&size=100&sort=statusCode,asc",
...

除了自定义排序、页面和大小参数之外,我找不到解决此问题的方法。但是构建一个与 spring 版本一样出色的自定义排序属性感觉就像又在发明轮子。这是否意味着我试图滥用 Spring 功能?使用 DTO 是相当普遍的,所以我很惊讶没有( Spring )教程解释你的休息界面中的分页涵盖了这部分。有解决办法吗?

最佳答案

我在我的项目中遇到了同样的问题,并通过完全分离 Controller 和数据层来解决它:

Controller 层对象:

public class QueryOptionsDTO {
int pageNumber;
int pageSize;
String sortField;
String sortDirection

public Pageable toPageable() {
Sort sort = Sort.by(sortField);
if (sortDirection.equals("asc")) {
sort = sort.ascending();
} else {
sort = sort.descending();
}
return PageRequest.of(pageNumber, pageSize, sort);
}
}

public class ResultPageDTO<YourObjectDTO> {
List<YourObjectDTO> results;
int pageNumber;
int pageSize;
int totalPages;
int totalSize;

public <YourDomainObject> ResultPageDTO<YourObjectDTO> from(Page page, Function<YourDomainObject, YourObjectDTO> mapper) {
// Custom logic to map to ResultPageDTO<YourObjectDTO>
}
}

@GetMapping
public ResultPageDTO<YourObjectDTO> find(@RequestParam QueryOptionsDTO queryOptionsDTO) {

PageResult<YourObject> pagedResults = objectQueryService.find(queryOptionsDTO.toPageable());

return ResultPageDTO.of(pagedResults);
}

这是伪代码,只是为了向您展示它是如何实现的。

关于java - Spring Pageable 排序暴露了 dao 的内部命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com