我有一个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); }}
小唯快跑啊
TA贡献1863条经验 获得超2个赞
我曾经不习惯的时候遇到过同样的问题the life in the IoC world
。@Autowired
我的一个bean 的字段在运行时为null。
根本原因是,我不是使用由Spring IoC容器(其@Autowired
字段被indeed
正确注入)维护的自动创建的bean,而是newing
我自己的bean类型的实例并使用它。当然这个@Autowired
字段是空的,因为Spring没有机会注入它。
慕标5832272
TA贡献1966条经验 获得超4个赞
这似乎是罕见的情况,但这是发生在我身上的事情:
我们使用的@Inject
不是@Autowired
Spring支持的javaee标准。每个地方都运转良好,豆子正确注入,而不是一个地方。豆注射似乎是一样的
@InjectCalculator myCalculator
最后我们发现错误是我们(实际上,Eclipse自动完成功能)导入com.opensymphony.xwork2.Inject
而不是javax.inject.Inject
!
所以总结一下,确保您的注释(@Autowired
,@Inject
,@Service
,...)有正确的包!
添加回答
举报
0/150
提交
取消