我正在使用spring Pageable数据和对象。当按数据库中可能具有相同值的字段排序时,更改页面将检索错误的结果。
我尝试使用HandlerInterceptorAdapter添加默认的order by id,如下所示:
我的拦截器:
public class OrderByIdWebArgumentResolver extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
HandlerMethod hm= (HandlerMethod) handler;
Method method = hm.getMethod();
OrderById orderById = method.getAnnotation(OrderById.class);
if (orderById != null) {
for (MethodParameter parametro : hm.getMethodParameters()) {
if (parametro.getGenericParameterType().equals(Pageable.class)) {
Map<String, String[]> parameters = request.getParameterMap();
String[] sortById = new String[2];
sortById[0] = "id";
sortById[0] = "desc";
parameters.put("sort", sortById);
}
}
}
return true;
}
}
我的控制器:
@OrderById
@RequestMapping(value = "/print", method = RequestMethod.GET)
public String printMensagges(@ModelAttribute MensaggesOption messageSelector, final ModelMap model,
@SortDefault(sort = "date", direction = Sort.Direction.DESC) @PageableDefault(value = 5) final Pageable pageable, final Principal principal) {
//I need the pageable has order by id here or in a service method
List<Message> messages = messageService.findAll(pageable);
return "/index";
}
我得到这个错误:
java.lang.IllegalStateException:JBWEB000096:不允许对锁定的ParameterMap进行修改
有没有什么方法可以添加默认顺序?你能添加一个有Pageable参数的服务方法吗?
4条答案
按热度按时间goucqfw61#
您可以只在@PageableDefault定义中添加排序,而不是添加单独的@SortDefault。
tsm1rwdh2#
使用@PageableDefault添加排序和方向:
mfpqipee3#
这是我的解决方案(与定制字段名称的额外排序)。
可分页参数的注解(用于自定义字段名称):
配置(此处为问题的主要答案):
控制器:
amrnrhlw4#
Spring允许提供多个排序规则,每个规则使用专用的annotation
@SortDefault.SortDefaults
具有不同的排序方向。请注意,尽管@PageableDefault
注解允许多个排序列,但它不允许应用不同的排序方向,而只允许应用于所有列的单个值。