You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

最终验证

完成上述修改后,重新启动应用:

  1. 调用/methodInject接口,此时控制器会获取容器中已注入ObjectMapper的GreeterService实例,不会再出现空指针。
  2. 也可在控制器中通过构造注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:50:45