Исключение, создаваемое репозиторием Spring Jpa, не попадает в обработчик исключений @Controller Advice - PullRequest
0 голосов
/ 15 декабря 2018

Ниже мой класс 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 в моем слое Service, и добавлю свой пользовательский InvalidRequestException, то это попадет в обработчик исключений.

Может кто-нибудь, пожалуйста, дайте мне знатьпричина и как я могу поймать PropertyReferenceException в моем ExceptionHandler

1 Ответ

0 голосов
/ 17 декабря 2018

Проблема заключается в несовпадении этой строки - @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)

...