SpringBoot中基于@Autowired的依赖注入出现空指针异常问题
问题分析与解决方案
你遇到的空指针异常核心原因是:控制器方法中拿到的GreeterService并非Spring容器中已注入ObjectMapper的实例,而是Spring MVC新创建的未初始化对象。结合你的代码和补充信息,具体排查和解决步骤如下:
1. 确保控制器被Spring正确管理
检查你的控制器类:
- 必须添加
@RestController(或@Controller)注解,否则Spring不会将其识别为MVC控制器。 - 控制器所在包需在
@SpringBootApplication的扫描范围内(主类com.example.demo及其子包)。如果控制器在其他包,需修改主类的扫描范围:
@SpringBootApplication(scanBasePackages = {"com.example.demo", "你的控制器所在包"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
只有控制器被Spring管理,方法参数中的GreeterService才会从容器中获取已初始化的Bean,而非新创建空实例。
2. 简化GreeterService的Bean配置
你当前通过@Configuration手动创建Bean的方式没问题,但可以更简洁且避免配置失误:
直接给GreeterService添加@Component注解,利用Spring的自动构造注入(Spring 4.3+无需@Autowired):
@Component public class GreeterService { private final ObjectMapper objectMapper; // 构造方法自动注入ObjectMapper,无需@Autowired public GreeterService(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } public String greeting() throws JsonProcessingException { return objectMapper.writeValueAsString(new HelloData()); } }
此时可以删除你的Config类,Spring会自动扫描并创建GreeterServiceBean,同时注入默认的ObjectMapper(SpringBoot自动配置提供)。
3. 验证配置正确性(若坚持使用@Configuration)
如果仍想通过配置类创建Bean,需确保:
Config类所在包在@SpringBootApplication的扫描范围内,否则@Bean方法不会被执行。- 无需在
@Bean方法参数上添加@Autowired,Spring会自动解析并注入容器中的ObjectMapper:
@Configuration public class Config { @Bean public GreeterService greeterService(ObjectMapper objectMapper) { return new GreeterService(objectMapper); } }
最终验证
完成上述修改后,重新启动应用:
- 调用
/methodInject接口,此时控制器会获取容器中已注入ObjectMapper的GreeterService实例,不会再出现空指针。 - 也可在控制器中通过构造注入
GreeterService,进一步验证:
@RestController public class GreetingController { private final GreeterService greeterService; public GreetingController(GreeterService greeterService) { this.greeterService = greeterService; } @GetMapping(path = "methodInject") public Object methodInject() throws JsonProcessingException { return greeterService.greeting(); } }
内容的提问来源于stack exchange,提问作者dc10
相关产品推荐
相关产品推荐

