亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的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 關注
  • 2518 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號