首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

基础概念

HttpMediaTypeNotAcceptableException 是 Spring 框架中的一个异常,表示客户端请求的媒体类型(如 Content-TypeAccept 头)不被服务器支持。这个异常通常发生在 RESTful API 中,当客户端请求的资源无法以客户端期望的格式返回时。

相关优势

  1. 明确性:该异常明确指出了客户端请求的媒体类型不被接受,有助于快速定位问题。
  2. 灵活性:通过自定义异常处理,可以灵活地返回不同的响应格式或错误信息。

类型与应用场景

  • 类型:这是一个运行时异常,继承自 RuntimeException
  • 应用场景:主要出现在 RESTful API 中,特别是在处理不同媒体类型的请求时。

问题原因及解决方法

问题原因

HttpMediaTypeNotAcceptableException 不会被同一控制器中的 @ExceptionHandler 捕获的原因通常是因为 Spring 的异常处理机制默认情况下不会在同一个控制器内部捕获这种类型的异常。Spring 会将这种异常视为全局异常,并尝试在更高层次的异常处理器中处理它。

解决方法

为了捕获并处理这个异常,可以采取以下几种方法:

  1. 全局异常处理器:使用 @ControllerAdvice@ExceptionHandler 注解创建一个全局异常处理器。
代码语言:txt
复制
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
    public ResponseEntity<String> handleHttpMediaTypeNotAcceptable(HttpMediaTypeNotAcceptableException ex) {
        return new ResponseEntity<>("Media type not acceptable", HttpStatus.NOT_ACCEPTABLE);
    }
}
  1. 局部异常处理器:在特定控制器内部使用 @ExceptionHandler 注解。
代码语言:txt
复制
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.HttpMediaTypeNotAcceptableException;

@RestController
public class MyController {

    @GetMapping("/example")
    public String example() {
        // 模拟抛出异常
        throw new HttpMediaTypeNotAcceptableException("Example exception");
    }

    @ExceptionHandler(HttpMediaTypeNotAcceptableException.class)
    public ResponseEntity<String> handleHttpMediaTypeNotAcceptable(HttpMediaTypeNotAcceptableException ex) {
        return new ResponseEntity<>("Media type not acceptable", HttpStatus.NOT_ACCEPTABLE);
    }
}
  1. 配置消息转换器:确保你的控制器方法能够处理客户端请求的媒体类型。
代码语言:txt
复制
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.MediaType;

@RestController
public class MyController {

    @GetMapping(value = "/example", produces = MediaType.APPLICATION_JSON_VALUE)
    public String example() {
        return "{\"message\": \"Hello, World!\"}";
    }
}

通过以上方法,可以有效捕获并处理 HttpMediaTypeNotAcceptableException 异常,确保 API 的健壮性和用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

@ControllerAdvice全局异常处理器没生效?生产报错日志看得眼花缭乱...

因为Exception是所有异常的父类,所以当程序中抛出异常,添加ExceptionHandler注解的方法中没有具体的异常类型与之相匹配时,那都会被下面的方法捕获处理。...从结果来看,BaseController里面的ExceptionHandler已经捕获了异常,所以全局异常处理器的就给忽略了。...总结 当程序中抛出一个异常时,Spring 框架会捕获这个异常,并依次按照如下顺序开始寻找合适的@ExceptionHandler方法来处理这个异常。...Spring 会从当前控制器类中查找是否有匹配的@ExceptionHandler方法。如果有多个@ExceptionHandler方法,Spring 会根据异常类型和方法参数来选择最匹配的一个。...如果在当前控制器类中没有找到匹配的@ExceptionHandler方法,Spring 会向上搜索控制器的父类,看看是否有匹配的方法。

82910

掌握 Spring 之异常处理

image-20190518131151510 @ExceptionHandler 接下来我们看下 @ExceptionHandler 的用法,这个注解通常定义在某个控制器下的方法里,表明处理该控制器出现的指定异常...可以设置多个需要捕获处理的异常类型,也可以不填默认为所有异常类,更多信息可以查看 mvc-ann-exceptionhandler 然后使用 Postman 工具模拟请求项目的 API 接口 /exception2...image-20190518134744575 这样方式使用 @ExceptionHandler 存在一个缺陷,就是只会针对当前控制器下的异常处理,若需要实现全局控制器的异常处理,还需要配合注解 @ControllerAdvice...@ControllerAdvice Spring 3.2 引入了一种新注解 @ControllerAdvice,用于将所有控制器中异常的处理放在一处进行,将指定一个类作为全局异常处理器,用 @ExceptionHandler...这表明了异常处理也存在优先级,先交给当前控制器内的 @ExceptionHandler方法处理,若未处理再由全局的@ExceptionHandler 方法处理。

1.7K20
  • 求求你们了,别再写满屏的 try catch 了!看如何更优雅地处理异常?

    所以注解@ControllerAdvice出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...,会被判定为:缺少路径参数; MissingServletRequestParameterException:缺少请求参数。...串反序列化成 pojo 的过程中失败了,也会抛该异常; HttpMessageNotWritableException:返回的 pojo 在序列化成 json 过程失败了,那么抛该异常; HttpMediaTypeNotAcceptableException...实际上,当出现404的时候,默认是不抛异常的,而是 forward跳转到/error控制器,spring也提供了默认的error控制器,如下: BasicErrorController 那么,如何让404...spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 如此,就可以异常处理器中捕获它了

    97610

    统一异常处理介绍及实战

    所以注解@ControllerAdvice出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...,会被判定为:缺少路径参数; MissingServletRequestParameterException:缺少请求参数。...串反序列化成 pojo 的过程中失败了,也会抛该异常; HttpMessageNotWritableException:返回的 pojo 在序列化成 json 过程失败了,那么抛该异常; HttpMediaTypeNotAcceptableException...实际上,当出现404的时候,默认是不抛异常的,而是 forward跳转到/error控制器,spring也提供了默认的error控制器,如下: ?...spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 如此,就可以异常处理器中捕获它了

    1.4K20

    第7章—SpringMVC高级技术—处理异常

    对于@ExceptionHandler注解标注的方法来说,比较有意思的一点在于它能处理同一个控制器中所有处理器方法所抛出的异常。...3.4为控制器添加通知 如果多个控制器类中都会抛出某个特定的异常,那么你可能会发现要在所有的控制器方法中重复相同的@ExceptionHandler方法。...或者,为了避免重复,我们会创建一个基础的控制器类,所有控制器类要扩展这个类,从而继承通用的@ExceptionHandler方法。...@ControllerAdvice最为实用的一个场景就是将所有的@ExceptionHandler方法收集到一个类中,这样所有控制器的异常就能在一个地方进行一致的处理。 ?...在重定向后,存在会话中的flash属性会被取出,并从会话转移到模型之中。 ? img ?

    1.4K40

    减少 try catch竟然这么容易?

    所以注解@ControllerAdvice出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...:然后再对请求头与控制器支持的做比较,比如content-type请求头,若控制器的参数签名包含注解@RequestBody,但是请求的content-type请求头的值没有包含application/...,会被判定为:缺少路径参数; MissingServletRequestParameterException:缺少请求参数。...实际上,当出现404的时候,默认是不抛异常的,而是 forward跳转到/error控制器,spring也提供了默认的error控制器,如下: 那么,如何让404也抛出异常呢,只需在properties...spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 如此,就可以异常处理器中捕获它了

    78310

    替代try catch处理异常的优雅方式

    所以注解@ControllerAdvice出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...:然后再对请求头与控制器支持的做比较,比如content-type请求头,若控制器的参数签名包含注解@RequestBody,但是请求的content-type请求头的值没有包含application/...,会被判定为:缺少路径参数; MissingServletRequestParameterException:缺少请求参数。...实际上,当出现404的时候,默认是不抛异常的,而是forward跳转到/error控制器,spring也提供了默认的error控制器,如下: 那么,如何让404也抛出异常呢,只需在properties...spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 如此,就可以异常处理器中捕获它了

    42321

    解决Spring MVC中的HttpMediaTypeNotAcceptableException异常

    客户端请求中的Accept字段不正确或不匹配服务器的响应类型除了服务器无法提供所需的媒体类型外,HttpMediaTypeNotAcceptableException异常还可能是由于客户端请求中的Accept...客户端请求中的Accept字段不正确或不匹配服务器的响应类型除了服务器无法提供所需的媒体类型外,HttpMediaTypeNotAcceptableException异常还可能是由于客户端请求中的Accept...如果客户端请求中的Accept字段不正确或不匹配服务器的响应类型,就会出现HttpMediaTypeNotAcceptableException异常。...如果客户端请求中的Accept字段不匹配任何已配置的媒体类型,服务器将返回JSON格式的响应。3....在异常处理器中,您可以捕获HttpMediaTypeNotAcceptableException异常,并返回适当的错误响应,如下所示:@ControllerAdvicepublic class CustomExceptionHandler

    5.1K10

    减少 try catch ,可以这样干!

    所以注解@ControllerAdvice出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...:然后再对请求头与控制器支持的做比较,比如content-type请求头,若控制器的参数签名包含注解@RequestBody,但是请求的content-type请求头的值没有包含application/...,会被判定为:缺少路径参数; MissingServletRequestParameterException:缺少请求参数。...实际上,当出现404的时候,默认是不抛异常的,而是 forward跳转到/error控制器,spring也提供了默认的error控制器,如下: 那么,如何让404也抛出异常呢,只需在properties...spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 如此,就可以异常处理器中捕获它了

    85240

    Spring MVC统一异常处理 - `@ExceptionHandler`

    概述 在Web应用程序中,错误和异常是不可避免的。Spring MVC框架提供了@ExceptionHandler注解,用于捕获和处理控制器中抛出的异常。...通过在控制器方法中标记@ExceptionHandler,可以为特定类型的异常提供自定义的处理逻辑。该注解可以应用于控制器类级别或方法级别。...当控制器中抛出MyException异常时,handleMyException方法会被调用,返回一个包含错误信息的ModelAndView。...: 创建一个控制器类,用于处理订单相关操作,并在控制器中添加@ExceptionHandler方法来处理OrderException异常。...结论 Spring MVC的@ExceptionHandler注解为Web应用程序提供了便捷的异常处理机制。通过使用该注解,可以在控制器中捕获和处理特定类型的异常,提供友好的错误信息给用户。

    1.6K10

    掌握这几个减少 try catch 的方法,让代码更简洁!

    所以注解@ControllerAdvice出现了,简单的说,该注解可以把异常处理器应用到所有控制器,而不是单个控制器。...:然后再对请求头与控制器支持的做比较,比如content-type请求头,若控制器的参数签名包含注解@RequestBody,但是请求的content-type请求头的值没有包含application/...,会被判定为:缺少路径参数; MissingServletRequestParameterException:缺少请求参数。...实际上,当出现404的时候,默认是不抛异常的,而是 forward跳转到/error控制器,spring也提供了默认的error控制器,如下: fa45573ef575a2ee9c754551729d953e.png...spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false 如此,就可以异常处理器中捕获它了

    50420

    SpringMVC的异常处理(一)

    异常处理的基本原则在实现SpringMVC异常处理之前,我们需要先了解一些基本原则,以确保我们能够正确地捕获和处理异常。以下是一些关键原则:异常应该在应用程序的最高级别上捕获。...这意味着我们应该将异常捕获到最外层的控制器中,然后再决定如何处理它。异常处理应该根据异常类型进行区分。...以下是三种常用的方式:@ExceptionHandler注解@ExceptionHandler注解是SpringMVC中的一种异常处理机制。...通过在控制器方法上添加@ExceptionHandler注解,我们可以将该方法定义为异常处理方法。当在该控制器中抛出指定类型的异常时,SpringMVC会自动调用该方法来处理异常。...当该类型的异常发生时,handleRuntimeException方法会被调用,并返回一个状态码为500的错误响应。

    23220

    重学SpringBoot3-Problemdetails

    本文将深入探讨 Spring Boot 3 中 Problem Details 的概念、应用及其对微服务架构的潜在影响。...RFC 7807 定义的 Problem Details 机制提供了一种标准化的方式,通过具体、一致的格式来传达错误信息,使得客户端能够更容易地理解和处理 API 响应中的错误。...这个实例是继承自 ResponseEntityExceptionHandler ,用于处理控制器中的异常,并返回相应的错误信息。...当前版本支持的异常类型,即如果系统出现以下异常,会被 SpringBoot 支持以 RFC 7807规范方式返回错误数据: @ExceptionHandler({ HttpRequestMethodNotSupportedException.class...Problem Details Spring Boot 3 中引入了对 Problem Details 的支持,使得开发者可以轻松地在自己的应用中应用这一标准。

    10810

    Spring Web MVC框架(六) 异常处理

    Spring Web MVC对异常处理有着完善的支持,我们可以捕获控制器中抛出的任何异常,然后按照异常类型将异常信息映射到某个视图文件,向用户显示对应的信息。...@ExceptionHandler 最简单的办法就是使用@ExceptionHandler注解。它可以定义到一个控制器中,处理该控制器抛出的异常。...@ExceptionHandler注解接受一个Class,指定捕获哪个异常。如果不指定这个值,则捕获方法参数列表中的所有异常。...当这样的异常抛出时,ResponseStatusExceptionResolver会捕获这些异常并设置相应的错误代码。...在Spring Web MVC中,该页面不仅可以是一个HTML或JSP页面,也可以是控制器中某个处理方法接受的URL。

    34520

    微服务项目:尚融宝(10)(后端接口:统一异常处理)

    ,但是你会发现,针对每个不同的异常我们都需要在项目中添加对应的处理方法,并捕获对应的异常对象,可能还要针对这个异常添加额外的依赖。...这显然不是最好的方式。 方案:此类异常直接抛出,并且用Exception类捕获就可以了。...4、恢复制造的异常 @TableField(value = "is_deleted") 四、自定义异常 目标:使用一个或较少的异常类,可以捕获和显示所有的异常信息。...方案:因此,我们可以创建一个自定义异常类(必须是运行时异常),在程序中抛出这个自定义异常对象,并在统一异常处理器中捕获自定义异常对象 1、创建自定义异常类 @Data @NoArgsConstructor...我们可以在控制台日志中查看具体的错误原因。前端只需要返回相对简单友好的提示即可。

    31830

    在SpringMVC中统一处理异常

    在SpringMVC中,允许开发人员自定义方法,用于统一处理异常,以至于某些异常可能在多种处理请求的过程中都可能出现,但是,只需要编写1次处理的代码即可!...则等同于这些处理请求的方法会将异常抛出,而SpringMVC框架在调用这些处理请求的方法时,会捕获这些异常,此时,如果开发人员自定义了处理异常的方法,则SpringMVC会在捕获到异常之后,调用处理异常的方法...; } return jsonResult; } 注意:当统一处理异常的代码在某个控制器类的内部时,只能作用于当前控制器类中抛出的异常!...如果需要统一处理异常的代码能够处理所有控制器类中的异常,可选的解决方法有: 创建控制器类的基类(所有控制器类的共同父类),将统一处理异常的代码放在基类中; 自定义某个类,将统一处理异常的代码放在这个类中...则表示handleException()将处理RuntimeException类型的异常,而其它类型的,例如IOException等异常将不会被该方法处理!

    31710
    领券