如何手动处理HttpMediaTypeNotAcceptableException?

时间:2019-06-18 20:34:38

标签: java spring spring-boot spring-mvc content-negotiation

我正在设置一台新服务器,并且想让用户在请求标头中提供接受媒体类型,在后端,我还配置了可生产的媒体类型。我创建了一个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
    }
}

我期望输出,如果我们通过任何不良的媒体类型而不是生产中的这两种,应该由自定义异常控制器处理,但是现在它仅适用于“ appliction / bad_value + json”,而不适用于“ application” /vnd.mime.v1+bad_value”。

对此有何投入?谢谢!

0 个答案:

没有答案