我已经使用spring Boot 创建了一个Web服务。我正在使用下面的URL对从数据库中检索到的所有项目进行排序(按projectId属性排序,排序方向是降序)
http://localhost:8081/api/projects?sort=projectId,desc
在我的控制器中,getAllProjects方法如下所示
@GetMapping
public ResponseEntity<Page<Project>> getAllProjects(
@Valid ProjectPage projectPage,
ProjectSearchCriteria projectSearchCriteria){
return null;
}
我的ProjectPage模型也可以接受多个排序查询参数
public class ProjectPage {
@Valid
private List<PageSort> sort;
}
我的PageSort模型如下所示
public class PageSort {
private String sortBy;
private String sortDirection;
}
为了将java.lang.String(请求URL中传递的projectId、desc)转换为PageSort,我使用了www.example.com中记录的转换器SPIhttps://docs.spring.io/spring-framework/docs/current/reference/html/core.html#core-convert-Converter-API,效果很好。
根据文档中的步骤;
步骤1:我已扩展WebMvcConfigurationSupport
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addFormatters(FormatterRegistry registry) {
registry.addConverter(stringToPageSortConverter());
super.addFormatters(registry);
}
@Bean
public StringToPageSortConverter stringToPageSortConverter(){
return new StringToPageSortConverter();
}
}
第二步:实现了如下的转换器
@Component
public class StringToPageSortConverter implements Converter<String, PageSort> {
@Override
public PageSort convert(String source) {
PageSort pageSort;
String[] _sort = source.split(",");
if(_sort.length > 1){
pageSort = PageSort.builder()
.sortBy(_sort[0])
.sortDirection(_sort[1])
.build();
}else{
pageSort = PageSort.builder()
.sortBy(_sort[0])
.sortDirection("asc")
.build();
}
return pageSort;
}
}
当我调用http://localhost:8081/api/projects?sort = projectId,desc并检查StringToPageSortConvertervariable类时,我看到了以下内容。(附上输出片段,因为它更容易以图形方式看到问题)
1).代码片段1符合预期
2).但是当我继续从断点恢复时,它再次命中断点,这在理想情况下是错误的。
在控制器的最后一个projectPage变量中,现在有两个排序对象。(第0个元素是正确的,第1个元素是不正确的,它根本不应该添加到那里)
我不确定我是否遗漏了什么。
我们非常感谢社会各界的任何意见。
干杯
2条答案
按热度按时间fruv7luv1#
尝试在控制器中使用此@PathVariable(“sort”):
pqwbnv8z2#
在控制器中添加以下代码修复了该问题
从以下堆栈溢出问题How to prevent Spring MVC from interpreting commas when converting to a Collection in Spring Boot?获得帮助