首页 > 解决方案 > Spring Jpa Repository 抛出的异常没有被异常处理程序@Controller Advice 捕获

问题描述

下面是我在 Spring Boot 中的 ExceptionHandler 类

@RestControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {


@ExceptionHandler({InvalidRequestException.class, PropertyReferenceException.class})
public final ResponseEntity<ExceptionDetails> handleInvalidRequestException(InvalidRequestException ex, WebRequest request) {
    ExceptionDetails details = new ExceptionDetails(ex.getMessage(),request.getDescription(false), new Date());
    return new ResponseEntity<ExceptionDetails>(details, HttpStatus.BAD_REQUEST);

}

}

现在下面是我的服务类中的代码。

@Override
public Page<Segment> listSegment(int pageNum, int size, String sortBy, String direction, String app) {
        log.info("Starting to query the segment list");
        Pageable pageable = createPageRequest(size, pageNum, sortBy, direction);
        Pageable pageable = new PageRequest(page, size, dir, sortBy);
        Page<Segment> resultPage = segmentRepository.findByApp(app,pageable);
        if(pageNum > resultPage.getTotalPages() || resultPage.getContent().isEmpty()) {
            log.info("No segment present");
            throw new ResourceNotFoundException("No Segment Present");
        }

        log.info("Total segment successfully fetched is: "+resultPage.getContent().size());
        if(resultPage.hasNext())
            return new Page<>(resultPage.getContent(), true);
        else
            return new Page<>(resultPage.getContent());
    }

如果sortBy我传递了一个无效的列名,那么这PropertyReferenceException不会像上面提供的代码那样被我的 ExceptionHandler 捕获,我不知道为什么。

但是,如果我在我的服务层中使用 try-catch 块捕获这个异常并抛出我的自定义InvalidRequestException,那么它就会被异常处理程序捕获。

请有人让我知道原因以及如何PropertyReferenceException在我的 ExceptionHandler中捕获

标签: javaspringspring-bootspring-restcontrollerspring-rest

解决方案


问题是您的这一行 - @ExceptionHandler({InvalidRequestException.class, PropertyReferenceException.class})& 方法签名不匹配handleInvalidRequestException(InvalidRequestException ex, WebRequest request)

您正在注释此方法以处理两个异常,但在方法参数中仅指定一个 & 该异常是一个非常具体的异常,因此它被调用InvalidRequestException。如果您希望两者都匹配到同一个方法,方法参数需要是两个异常的父类。

您要么需要更改由 slimane 回答的方法,要么有两个处理程序方法 - 每个异常一个。

@ExceptionHandler({InvalidRequestException.class}) handleInvalidRequestException(InvalidRequestException ex, WebRequest request)

&

@ExceptionHandler({PropertyReferenceException.class}) handlePropertyReferenceException(PropertyReferenceException ex, WebRequest request)


推荐阅读