为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的Spring @Autowired字段为空?

为什么我的Spring @Autowired字段为空?

我有一个Spring @Serviceclass(MileageFeeCalculator),它有一个@Autowiredfield(rateService),但该字段是null我尝试使用它时。日志显示正在创建MileageFeeCalculatorbean和MileageRateServicebean,但NullPointerException每当我尝试mileageCharge在我的服务bean上调用该方法时,我都会得到。为什么Spring没有自动装配领域?控制器类:@Controllerpublic class MileageFeeController {        @RequestMapping("/mileage/{miles}")    @ResponseBody    public float mileageFee(@PathVariable int miles) {        MileageFeeCalculator calc = new MileageFeeCalculator();        return calc.mileageCharge(miles);    }}服务类:@Servicepublic class MileageFeeCalculator {    @Autowired    private MileageRateService rateService; // <--- should be autowired, is null    public float mileageCharge(final int miles) {        return (miles * rateService.ratePerMile()); // <--- throws NPE    }}应该自动装配的服务bean,MileageFeeCalculator但它不是:@Servicepublic class MileageRateService {    public float ratePerMile() {        return 0.565f;    }}当我尝试时GET /mileage/3,我得到这个例外:java.lang.NullPointerException: null    at com.chrylis.example.spring_autowired_npe.MileageFeeCalculator.mileageCharge(MileageFeeCalculator.java:13)    at com.chrylis.example.spring_autowired_npe.MileageFeeController.mileageFee(MileageFeeController.java:14)    ...为什么我的Spring @Autowired字段为空?
查看完整描述

6 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

实际上,您应该使用JVM托管对象或Spring托管对象来调用方法。根据控制器类中的上述代码,您将创建一个新对象来调用具有自动连接对象的服务类。

MileageFeeCalculator calc = new MileageFeeCalculator();

所以它不会那样工作。

该解决方案使此MileageFeeCalculator成为Controller本身的自动连线对象。

像下面一样更改您的Controller类。

@Controllerpublic class MileageFeeController {

    @Autowired
    MileageFeeCalculator calc;  

    @RequestMapping("/mileage/{miles}")
    @ResponseBody
    public float mileageFee(@PathVariable int miles) {
        return calc.mileageCharge(miles);
    }}


查看完整回答
反对 回复 2019-05-21
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我曾经不习惯的时候遇到过同样的问题the life in the IoC world@Autowired我的一个bean 的字段在运行时为null。

根本原因是,我不是使用由Spring IoC容器(其@Autowired字段被indeed正确注入)维护的自动创建的bean,而是newing我自己的bean类型的实例并使用它。当然这个@Autowired字段是空的,因为Spring没有机会注入它。


查看完整回答
反对 回复 2019-05-21
?
慕标5832272

TA贡献1966条经验 获得超4个赞

这似乎是罕见的情况,但这是发生在我身上的事情:

我们使用的@Inject不是@AutowiredSpring支持的javaee标准。每个地方都运转良好,豆子正确注入,而不是一个地方。豆注射似乎是一样的

@InjectCalculator myCalculator

最后我们发现错误是我们(实际上,Eclipse自动完成功能)导入com.opensymphony.xwork2.Inject而不是javax.inject.Inject

所以总结一下,确保您的注释(@Autowired@Inject@Service,...)有正确的包!


查看完整回答
反对 回复 2019-05-21
  • 6 回答
  • 0 关注
  • 2389 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信