如何在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&lt;Sort.Order&gt; 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

Spring Boot,MongoDB,Pageable,按对象中的自定义方法排序

Spring Boot:Slice/Pageable 未根据页面返回正确的块