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

我有一个Spring @Serviceclass(MileageFeeCalculator),它有一个@Autowiredfield(rateService),但该字段是null我尝试使用它时。日志显示正在创建MileageFeeCalculatorbean和MileageRateServicebean,但NullPointerException每当我尝试mileageCharge在我的服务bean上调用该方法时,我都会得到。为什么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

    }

}

应该自动装配的服务bean,MileageFeeCalculator但它不是:


@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)

    ...

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

四季花海
浏览 2478回答 6
6回答

Smart猫小萌

实际上,您应该使用JVM托管对象或Spring托管对象来调用方法。根据控制器类中的上述代码,您将创建一个新对象来调用具有自动连接对象的服务类。MileageFeeCalculator&nbsp;calc&nbsp;=&nbsp;new&nbsp;MileageFeeCalculator();所以它不会那样工作。该解决方案使此MileageFeeCalculator成为Controller本身的自动连线对象。像下面一样更改您的Controller类。@Controllerpublic&nbsp;class&nbsp;MileageFeeController&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Autowired &nbsp;&nbsp;&nbsp;&nbsp;MileageFeeCalculator&nbsp;calc;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping("/mileage/{miles}") &nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;float&nbsp;mileageFee(@PathVariable&nbsp;int&nbsp;miles)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;calc.mileageCharge(miles); &nbsp;&nbsp;&nbsp;&nbsp;}}

小唯快跑啊

我曾经不习惯的时候遇到过同样的问题the life in the IoC world。@Autowired我的一个bean&nbsp;的字段在运行时为null。根本原因是,我不是使用由Spring IoC容器(其@Autowired字段被indeed正确注入)维护的自动创建的bean,而是newing我自己的bean类型的实例并使用它。当然这个@Autowired字段是空的,因为Spring没有机会注入它。

慕标5832272

这似乎是罕见的情况,但这是发生在我身上的事情:我们使用的@Inject不是@AutowiredSpring支持的javaee标准。每个地方都运转良好,豆子正确注入,而不是一个地方。豆注射似乎是一样的@InjectCalculator&nbsp;myCalculator最后我们发现错误是我们(实际上,Eclipse自动完成功能)导入com.opensymphony.xwork2.Inject而不是javax.inject.Inject!所以总结一下,确保您的注释(@Autowired,@Inject,@Service,...)有正确的包!
打开App,查看更多内容
随时随地看视频慕课网APP