java 相同控制器中的@ExceptionHandler未捕获Spring启动HttpMediaTypeNotAcceptableException

h43kikqp  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(154)

在我的 Spring 启动应用程序中,我有一个用于生成和使用JSON请求的post请求控制器,并且我已经为这个控制器定义了@ExceptionHandler,其中包含HttpMediaTypeNotAcceptableException,用于捕获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;
        }
}

curl :

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:已解决[无法验证数据库安全性异常:找不到可接受的表示形式]",但它不调用ExceptionHandler方法。
为什么它不调用所需的ExceptionHandler方法?

x4shl7ld

x4shl7ld1#

可能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;
    }
}
6kkfgxo0

6kkfgxo02#

我也遇到过类似的问题。我在抛出HttpStatus.NOT_ACCEPTABLE错误之前添加了内容类型标头MediaType.APPLICATION_JSON_VALUE,它可以正常工作。

相关问题