Spring Boot Sping Boot 转换器API未按预期转换排序对象

kiz8lqtg  于 2023-03-02  发布在  Spring
关注(0)|答案(2)|浏览(148)

我已经使用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个元素是不正确的,它根本不应该添加到那里)

我不确定我是否遗漏了什么。
我们非常感谢社会各界的任何意见。
干杯

fruv7luv

fruv7luv1#

尝试在控制器中使用此@PathVariable(“sort”):

@GetMapping
public ResponseEntity<Page<Project>> getAllProjects( @Valid @PathVariable("sort") ProjectPage projectPage, ProjectSearchCriteria projectSearchCriteria){
    return null;
}
pqwbnv8z

pqwbnv8z2#

在控制器中添加以下代码修复了该问题

@InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(List.class, new CustomCollectionEditor(List.class));
    }

从以下堆栈溢出问题How to prevent Spring MVC from interpreting commas when converting to a Collection in Spring Boot?获得帮助

相关问题