【发布时间】:2022-01-04 04:29:49
【问题描述】:
注意:这是针对常见问题的规范答案。
我有一个 Spring @Service 类 (MileageFeeCalculator),它有一个 @Autowired 字段 (rateService),但当我尝试使用它时,该字段是 null。日志显示MileageFeeCalculator bean 和MileageRateService bean 都在创建中,但是每当我尝试在我的服务bean 上调用mileageCharge 方法时,我都会得到NullPointerException。为什么 Spring 不自动装配该字段?
控制器类:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = new MileageFeeCalculator();
return calc.mileageCharge(miles);
}
}
服务类:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- should be autowired, is null
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile()); // <--- throws NPE
}
}
应该在 MileageFeeCalculator 中自动装配的服务 bean,但它不是:
@Service
public 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)
...
【问题讨论】:
-
另一种情况是在另一个 bean
S的构造函数中调用 beanF。在这种情况下,将所需的 beanF作为参数传递给其他 beanS构造函数,并用@Autowire注释S的构造函数。记得用@Component注释第一个beanF的类。 -
我在这里使用 Gradle 编写了一些与此非常相似的示例:github.com/swimorsink/spring-aspectj-examples。希望有人会觉得它有用。
标签: java spring null nullpointerexception autowired