Tomcat возвращает для ошибок HTML вместо JSON

Задача: есть REST сервис. Любые ошибки с любым статусом (4хх ил 5хх) он должен возвращать пользователю в виде JSON.

В чем проблема: для обработки ошибок и отправки ответов о них пользователю использую @RestControllerAdvice

@RestControllerAdvice
public class ExceptionResolver extends ResponseEntityExceptionHandler {

    //... часть кода пропущена

    @ExceptionHandler(value = MyException.class)
    public ResponseEntity<ExceptionResponse> handle(MyException e) {
        logger.error(e.getMessage(), e);
        return ResponseEntity.
                status(HttpStatus.BAD_REQUEST).
                body(mapper.toExceptionResponse(e, HttpStatus.BAD_REQUEST));
    }

    //... Другие аналогичные обработчики ошибок

}

Есть контроллер, методы которого могут выбрасывать такие исключения:

@RestController
@RequestMapping("/myEntities")
public class ProductController {

    //... часть кода пропущена

    @Transactional
    @PostMapping("/add")
    public ResponseEntity<MyEntityResponse> add(@RequestBody MyEntityRequest dto) {
        MyEntity myEntity = mapper.toMyEntityForAdd(dto); // -> Вот здесь может быть выбрашен MyException
        myEntityRepository.save(myEntity);
        return ResponseEntity.status(HttpStatus.OK).body(mapper.toProductResponse(product));
    }

    //... часть кода пропущена
}

Исключение MyException выброшенное именно из метода add возвращается пользователю в виде html страницы с кодом ошибки 500, а ожидается что будет возвращен JSON с кодом 400. При этом в логах появляется следующее:

Servlet.service() для сервлета [dispatcherServlet] в контексте с путем [/nutritionManager] выбросил исключение [Request processing failed; nested exception is MyException: some message

Я попробовал разобраться, в чем причина такого поведения. HTML страница с кодом ошибки 500 возвращается когда исключения кидаются самим Spring-ом. Т.е. иногда, исключение выброшенное из метода add() вместо обработки в @RestControllerAdvice приводит к какому-то внутреннему исключению Spring. Но в чем причина такого поведения - я не могу понять.


Ответы (0 шт):