当前位置: 首页 > 知识库问答 >
问题:

Spring-boot HttpMediaTypeNotAcceptableException未被@ExceptionHandler在同一控制器中捕获

贺亦
2023-03-14

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

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

@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
}' 

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

共有1个答案

颜华池
2023-03-14

也许springboot在识别消费和产生类型为application/json时遇到了困难,因为您在endpoint将其提供为“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;
    }
}
 类似资料:
  • 我在我的Java8应用程序中使用。我无法接触到这个功能。对于所有异常,HTTP响应总是500(带有我插入到异常中的消息),并且忽略方法。 当我的同事用Java7编译器运行该应用程序时,它可以工作。 @ExceptionHandler注释不能在Java8中使用的原因是什么? 控制器: 我删除了注释,并尝试使用解析器,但它不起作用。 解析器的代码,在与rest控制器类相同的包中:

  • 我使用以下代码设置了一个异常处理程序 我正在使用Spring Security 3.1。当我尝试在没有身份验证的情况下执行操作时,应用程序会引发 AccessDeniedException。它永远不会出现这种方法。但与其他例外情况一样工作正常。这是它应该工作的方式吗?还是我的代码有问题? 这看起来像一个解决方案。但是,如果我能在一个点上处理异常,那就更好了。 这是我的配置文件 更新 此处,用户未通

  • 我有一个关于Spring Security级别上的异常的问题。 安全配置 如果我根据答案更改代码,即使SM_USEr标头存在且正确,也会出现此异常

  • 我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台:

  • 我用Spring Boot和百里香SpringMVC。我有返回百里香模板名称的普通控制器和用< code>@RepsonseBody注释的REST控制器。 假设我有一个< code > EntityNotFoundException ,它是由控制器调用的某个代码抛出的。如果抛出,我想分别为REST控制器返回一个404状态代码和一个错误页面或错误消息。 我当前对普通控制器的设置: 对于REST控制程

  • 我想在Spring中正确地处理我的异常,所以我有一个关于exceptionHandler语法的问题:如果异常处理程序捕获了特定的异常,那么在控制器中抛出特定的异常可以吗?