Spring MVC:如何从 Pageable 获取 case-insensitive 排序

Spring MVC: how to get case-insensitive ordering from Pageable

当用户单击我网页上的列标题时,我正尝试在我的 Spring MVC 应用程序中支持 case-insensitive 排序。呈现页面时,Thymeleaf 扩展会创建一个锚点,href 是当前 URL,其中一些参数受 Pageable 支持:即 page, size and sort.

sort=propertyName,ASC 格式工作正常,但我无法从 URL 中找出如何说排序应该是 case-insensitive。我可以很容易地在代码中做到这一点,但标准的 Pageable 支持似乎不支持它。

经过一些调试后,标准框架 org.springframework.data.web.SortHandlerMethodArgumentResolver 似乎不支持 org.springframework.data.domain.Sort.Order.ignoreCase

我对此感到有些困惑,想知道是否有充分的理由?

我可以考虑创建自己的 SortHandlerMethodArgumentResolver class,并让它解析 ASCI|DESCI(表示 case-insensitive)和 ASCS|DESCS(表示意思是 case-sensitive) 并生成适当的 Sort object,但这让我印象深刻,因为这是相当多的工作和严肃的 "code smell".

我不是第一个偶然发现这个的人。有人有什么建议吗?

我认为唯一的选择是实现您的自定义 SortHandlerMethodArgumentResolver。文档对此有简要的指导 http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

To customize this behavior extend either SpringDataWebConfiguration or the HATEOAS-enabled equivalent and override the pageableResolver() or sortResolver() methods and import your customized configuration file instead of using the @Enable-annotation.

对于格式,我将其设为由 3 个元素组成的以逗号分隔的字符串:字段名称、方向、ignoreCase 标志。像这样:

sort=name,ASC,ignore

最后一个元素是可选的,因此可能有:

sort=name,ASC

这意味着 ignoreCase 为假。

还应该可以仅指定字段名称,例如:

sort=name

这意味着 ASC 和 ignoreCase 的默认方向为 false。

唯一的问题是,如果你想传递 ignoreCase 标志,你必须传递方向,我认为这应该不是一个大问题。

希望对您有所帮助!

顺便说一句,这里有一个用于此改进的 JIRA 项目 https://jira.spring.io/browse/DATACMNS-658(扩展 SortHandlerMethodArgument 解析器以能够检测忽略大小写的请求)

如果有人正在使用 Spring Data Commons 2.3 RC1 或更高版本并寻找查询参数,请使用以下内容。 (忽略大小写在 Spring Data Commons 2.3 RC1 及更高版本中开箱即用)

sort=name,ASC,ignorecase