注意:这是针对常见问题的标准答案。
我有一个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)
...
F
的Bean在另一个名为S
的Bean的构造函数中被调用时。在这种情况下,将所需的F
Bean作为参数传递给其他BeansS
构造函数,并在S
的构造函数上注释@Autowire
。记得要在第一个BeanF
的类上注释@Component
。 - aliopi