Spring-boot HttpMediaTypeNotAcceptableException 没有被同一控制器中的 @ExceptionHandler 捕获

May*_*yal 5 java spring exceptionhandler spring-boot

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

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

我不想定义 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;
        }
}
Run Code Online (Sandbox Code Playgroud)

卷曲:

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
}' 
Run Code Online (Sandbox Code Playgroud)

因此,每当我调用此 Curl 请求时,我都会得到默认的错误请求响应,控制台日志为“DefaultHandlerExceptionResolver:已解决 [org.springframework.web.HttpMediaTypeNotAcceptableException:无法找到可接受的表示]”,但它不会调用 ExceptionHandler 方法。

为什么它不调用所需的 ExceptionHandler 方法?

Ana*_*han 0

也许 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;
    }
}
Run Code Online (Sandbox Code Playgroud)