Spring-boot HttpMediaTypeNotAcceptableException не попадает @ExceptionHandler в тот же контроллер - PullRequest
2 голосов
/ 06 апреля 2020

В моем весеннем загрузочном приложении у меня есть контроллер для пост-запроса, который создает и потребляет JSON запрос, и я определил @ExceptionHandler для этого контроллера с HttpMediaTypeNotAcceptableException для перехвата исключений HttpMediaTypeNotAcceptableException (406 кода состояния).

Теперь, когда я вызываю запрос на публикацию с неправильным заголовком ACCEPT, таким как application / pdf, определенное исключение не вызывается.

Я не хочу определять ControllerAdvice, так как я хотел бы бросить определенное c ошибка для этого контроллера.

код:

@RestController
@RequestMapping("/school")
public class SchoolCotroller {

    @Autowired
    private SchoolService schoolService;

    @PostMapping(produces = "Application/Json", consumes = "Application/Json")
    @ResponseStatus(HttpStatus.CREATED)
    public School postData(@Valid @RequestBody School school)  {

       return  schoolService.save(school);

    }
 @ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
    String handleMediaTypeNotAcceptable(
            final HttpMediaTypeNotAcceptableException exception,
            final NativeWebRequest request) {
        return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
        }
}

curl:

curl --location --request POST 'http://localhost:8080/school' \
--header 'Accept: application/pdf' \
--header 'Content-Type: application/json' \
--data-raw '{
    "studentName":"mayank",
    "course":1,
    "teacher":"e",
    "id":1
}' 

Таким образом, всякий раз, когда я вызываю этот запрос Curl, я получаю ответ по умолчанию о неверном запросе с Журнал консоли отображается как «DefaultHandlerExceptionResolver: Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Не удалось найти приемлемое представление]», но он не вызывает метод ExceptionHandler.

Почему он не вызывает требуемый метод ExceptionHandler?

1 Ответ

0 голосов
/ 06 апреля 2020

Возможно, у Springboot возникли проблемы с распознаванием расходных материалов, и тип выводится как application/json, поскольку вы указали его как "Application/Json" в своей конечной точке. Попробуйте следующий код:

@RestController
@RequestMapping("/school")
public class SchoolCotroller {

    @Autowired
    private SchoolService schoolService;

    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE , consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    public School postData(@Valid @RequestBody School school)  {

       return  schoolService.save(school);

    }

    @ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
    @ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
    String handleMediaTypeNotAcceptable(
            final HttpMediaTypeNotAcceptableException exception,
            final HttpServletRequest request) {
        return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE;
    }
}
...