Spring Boot gRPC场景下@GrpcAdvice无法处理@GRpcService异常是否需额外配置
问题排查与解决方案
正常情况下不需要额外配置,@GrpcAdvice 捕获失效通常是以下几个常见原因导致的:
- 确认依赖版本符合要求
你使用的net.devh:grpc-spring-boot-starter需要是2.10.0及以上版本,低于该版本的starter没有内置@GrpcAdvice和@GrpcExceptionHandler的支持,旧版本需要手动实现全局异常拦截器才能实现同类需求。
注:该注解是net.devh系列gRPC starter的特有特性,如果你使用的是Spring官方原生gRPC starter,没有该原生能力。 - 确保异常处理类被Spring上下文扫描到
@GrpcAdvice注解本身已经复合了@Component注解,只需要保证ExceptionHandlers类在Spring Boot的包扫描路径下即可:- 如果
ExceptionHandlers所在的包和主启动类所在的包是父子级关系,不需要额外配置 - 如果不在扫描范围内,需要在主启动类上添加
@ComponentScan(basePackages = "你的ExceptionHandlers所在包路径")主动扫描
- 如果
- 检查异常处理方法的返回值类型符合要求
@GrpcExceptionHandler标注的方法支持的返回值类型仅限如下几种,返回其他类型会导致方法不被识别为合法的异常处理方法:io.grpc.Statusio.grpc.StatusExceptionio.grpc.StatusRuntimeException- 如果需要返回自定义响应体+正常状态码,也可以返回gRPC方法对应的响应消息类型
你当前代码里的返回值是Status属于合法类型,只需要确保方法最后正常返回构造后的Status对象即可,不要遗漏返回语句。
- 排查自定义拦截器是否吞掉了异常
如果你手动配置了全局ServerInterceptor,需要检查拦截器中是否提前捕获了业务抛出的异常、没有继续向后传递,这种情况会导致异常无法到达@GrpcExceptionHandler。 - 确认异常没有被业务代码提前捕获
检查你的generalCall方法中是否存在try-catch块吞掉了IllegalArgumentException,没有将异常抛出到方法外,只有抛出到方法外的异常才会被全局异常处理器捕获。
内容的提问来源于stack exchange,提问作者Pooya Mirzapour
相关产品推荐
相关产品推荐

