如何在spring boot中使用Pageable接口从http url中删除/处理不相关或错误的排序参数?
Posted
技术标签:
【中文标题】如何在spring boot中使用Pageable接口从http url中删除/处理不相关或错误的排序参数?【英文标题】:How to remove/handle irrelevant or bad sort parameters from http url using Pageable interface in spring boot? 【发布时间】:2020-05-19 16:58:11 【问题描述】:如何在 Spring Boot 中使用 Pageable 接口从 http url 中删除/处理不相关或错误的排序参数?
例如我有一个像这样的查询 http://localhost:8080/all?sort=firstName,asc&sort=nosuchfield,asc
如何处理或删除不相关的字段“nosuchfield”?
另外,如何限制 URL 中的排序参数?
【问题讨论】:
【参考方案1】:如果数据库中不存在排序字段,则 Spring JPA 将抛出以下异常。
org.springframework.data.mapping.PropertyReferenceException: No property nosuchfield found for type <TYPE>!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:94)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:382)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358)
但是,可以使用各种类型来处理异常。最终,您可以将其记录下来或将其转换为任何自定义异常。根据我的要求,我已将其转换为自定义异常。
-
使用 AOP
@Aspect
@Component
public class UnKnownColumnSortingExceptionHandler
@AfterThrowing(pointcut = "execution(* com.repositorypackage.*.*(..))", throwing = "exception")
public void executeWhenExceptionThrowninRepository(JoinPoint jp, Throwable ex)
if (ex instanceof PropertyReferenceException)
throw new CustomException("Invalid Database operation");
-
使用
@ControllerAdvice
(应用程序中的异常处理)
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler
public GlobalExceptionHandler()
@ExceptionHandler(PropertyReferenceException.class)
public ResponseEntity<Void> handleAllExceptions(Exception ex, WebRequest req)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
-
Controller 中的异常处理
将以下代码添加到您的控制器中
@ExceptionHandler(PropertyReferenceException.class)
public ResponseEntity<Void> handleAllExceptions(Exception ex, WebRequest req)
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
【讨论】:
我们如何在restcontroller api中处理这个错误? 根据您的要求修改了答案 谢谢你会尝试最后一个,并会回复你! 我们可以限制控制器或服务级别的排序参数吗?Iterator<Sort.Order> iterator = pageable.getSort().iterator();
,Pagable#getSort 将为您提供请求字段的迭代器,您可以在服务类中设置大小限制检查或任何其他业务条件以上是关于如何在spring boot中使用Pageable接口从http url中删除/处理不相关或错误的排序参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何记录Spring Boot JPA Pageable绑定值?
Spring Boot集成Swagger的Pageable参数问题
Spring Boot:以 Pageable 作为请求参数的 @GetMapping 无法按预期工作
Spring Boot - Jpa Distinct 和 Pageable