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. Но в чем причина такого поведения - я не могу понять.