Spring项目调用FeignClient方法时抛出NullPointerException异常
Spring调用自定义FeignClient触发空指针异常修复
问题相关代码
FeignClient定义
@FeignClient(url="http://localhost:8080", name="feignClient") public interface CallFeignClient { @RequestMapping(path = "/start") public String start(); }
业务Service类
@Service public class Call { @Autowired private CallFeignClient callFeignClient ; public Call() { } public void call() { callFeignClient.start(); } }
根因排查与修复方案
按优先级从高到低排查以下问题:
- 未开启Feign客户端扫描
Spring Boot启动类必须添加@EnableFeignClients注解,否则Spring不会识别@FeignClient标记的接口,不会生成代理Bean注册到容器,注入的属性自然为null。修复示例:@SpringBootApplication @EnableFeignClients public class ProjectApplication { public static void main(String[] args) { SpringApplication.run(ProjectApplication.class, args); } } - Feign接口不在扫描包范围内
如果Feign接口所在包不是启动类所在包的同层级/子包,默认扫描规则无法覆盖,需要手动指定扫描路径:// 替换为实际Feign接口所在的包路径 @EnableFeignClients(basePackages = "com.example.project.feign") - 未引入Feign起步依赖
未引入OpenFeign依赖时相关注解不会生效,Maven项目需在pom.xml中添加:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> - 业务类未交给Spring容器管理
如果是手动通过new Call()创建Call类实例,对象不受Spring管控,@Autowired标记的属性不会被注入,永远为null。必须通过依赖注入的方式从容器获取Call实例,禁止手动new被Spring注解标记的类。 - 依赖注入完成前提前调用Feign方法
Spring实例化Bean的流程是先执行构造方法,再完成属性注入,如果在构造方法中直接调用callFeignClient.start(),执行时属性还未赋值,必然触发空指针。如果需要在Bean初始化阶段调用Feign方法,推荐改用构造器注入的方式,保证实例化时依赖已经传入:@Service public class Call { private final CallFeignClient callFeignClient; // 构造器注入,实例化时就保证依赖不为空 public Call(CallFeignClient callFeignClient) { this.callFeignClient = callFeignClient; // 此处调用callFeignClient.start()不会触发空指针 } public void call() { callFeignClient.start(); } }
内容的提问来源于stack exchange,提问作者Hans95
相关产品推荐
相关产品推荐

