【问题标题】:Spring-boot HttpMediaTypeNotAcceptableException is not getting caught by @ExceptionHandler in same controllerSpring-boot HttpMediaTypeNotAcceptableException 没有被同一控制器中的@ExceptionHandler 捕获
【发布时间】:2020-04-06 06:46:39
【问题描述】:

在我的 Spring Boot 应用程序中,我有一个用于发布请求的控制器,它产生和使用 JSON 请求,并且我为这个控制器定义了 @ExceptionHandler,并使用 HttpMediaTypeNotAcceptableException 捕获 HttpMediaTypeNotAcceptableException(406 状态代码)异常。

现在,每当我使用错误的 ACCEPT 标头(例如 application/pdf)调用发布请求时,都不会调用定义的异常。

我不想定义 ControllerAdvice,因为我想为这个控制器抛出一个特定的错误。

代码:

@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 --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:已解决 [org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示]”,但它不会调用 ExceptionHandler 方法。

为什么没有调用需要的ExceptionHandler方法?

【问题讨论】:

    标签: java spring spring-boot exceptionhandler


    【解决方案1】:

    也许 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;
        }
    }
    

    【讨论】:

    • 即使将产品更改为“MediaType.APPLICATION_JSON_VALUE”后,它仍然提供相同的东西
    • @MayankGoyal 我已经更新了我的答案,请您再次检查此代码。
    • 用上面的代码试过,但没有运气。另一个有趣的事情是,如果我添加 @ExceptionHandler(Exception.class) 而不是 @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) 那么它也不会调用该方法。
    • 你缺少一个@ControllerAdvice
    猜你喜欢
    • 2015-11-14
    • 2016-12-16
    • 2020-06-05
    • 1970-01-01
    • 2013-01-03
    • 2019-09-14
    • 1970-01-01
    • 2017-12-30
    • 2017-12-07
    相关资源
    最近更新 更多