java - Spring-boot HttpMediaTypeNotAcceptableException 没有被同一控制器中的@ExceptionHandler 捕获
问题描述
在我的 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 方法?
解决方案
也许 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;
}
}
推荐阅读
- swift - Swift 5:如何从提供的字符串计算正确的日期?
- oracle - 从 Oracle 存储函数返回静态 CLOB
- reactjs - onClick 函数在 Material-ui 表中触发了多次而不是一次
- php - PHP - 将数字转换为科学计数法
- python - 每天运行 python 脚本 - Mac
- android - 根据其在列表中的位置从firestore中检索文档
- swift - 如何在 UITableView 上使用显示字体设置 UIFont 系列和名称?
- amazon-web-services - 如何使用 AWS API 获取正在运行的 EC2 实例的目标组
- sql - 查询字符串列的 Redshift Spectrum 数组
- excel - 为 excel 选择数据 当我使用 sql 加载数据时,图表显示为零