Как обрабатывать HttpMediaTypeNotAcceptableException вручную? - PullRequest
0 голосов
/ 18 июня 2019

Я настраиваю новый сервер и хочу, чтобы пользователи указали тип принимаемого носителя в заголовке запроса, а в бэкэнде я также настроил типы носителя. Я создал класс ExceptionController как @ControllerAdvice для обработки некоторых исключений вручную, одним из которых является HttpMediaTypeNotAcceptableException (406). Я использую тип носителя поставщика, что-то вроде «application / vnd.mime.v1 + json», он может быть обработан правильно, когда я помещаю что-то плохое в строку поставщика, но если я изменю «json» на что-то странное, вроде "json8" или "pdf", я получу пустое тело ответа, которое отличается от другого.

Это мой ExceptionController:

@ControllerAdvice
public class ExceptionController {
    private static final Logger LOG = Logger.getLogger(ExceptionController.class);

    public ExceptionController() {
    }

    @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})
    @ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
    public HttpEntity<? extends ResourceSupport> handleNotAcceptableMediaTypeException(HttpServletRequest request, HttpMediaTypeNotAcceptableException ex) {
        LOG.error("Returned status code " + HttpStatus.NOT_ACCEPTABLE.value(), ex);
        CollectionResource response = new CollectionResource();
        CommonErrorCode invalidVendorMediaType = CommonErrorCode.INVALID_VENDOR_MEDIA_TYPE;
        String mediaType = MediaType.toString(ex.getSupportedMediaTypes());
        invalidVendorMediaType.setMessageParameters(new String[]{mediaType});
        response.getErrors().addAll(this.errorHandler.returnError(invalidVendorMediaType));
        return new ResponseEntity(response, HttpStatus.NOT_ACCEPTABLE);
    }
}

Мой контроллер похож на:

public class controller {
    @GetMapping(path = "/xxx", produces = {"application/vnd.mime.v1+json", MediaType.APPLICATION_JSON_VALUE}
    public ResponseEntity<> getXXX (){
        // logic here
    }
}

Я ожидаю, что вывод, если мы передадим какой-либо плохой тип носителя вместо этих двух в продуктах, он должен обрабатываться контроллером пользовательских исключений, но теперь он работал только для "applicationtion / bad_value + json", но не для "приложения" /vnd.mime.v1+bad_value".

Есть какие-либо материалы по этому вопросу? Спасибо!

...