为什么我的spring@autowired字段为空?

zpgglvta  于 2021-07-13  发布在  Java
关注(0)|答案(16)|浏览(438)

注:这是一个常见问题的标准答案。
我有一个Spring @Service 班级( MileageFeeCalculator )有一个 @Autowired 字段( rateService ),但这个领域 null 当我尝试使用它的时候。日志显示 MileageFeeCalculator 豆子和咖啡 MileageRateService 正在创建bean,但我得到一个 NullPointerException 每当我打电话给 mileageCharge 方法。为什么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)
    ...
sg2wtvxw

sg2wtvxw16#

更新:真正聪明的人很快就指出了这个答案,这就解释了下面描述的奇怪之处
原始答案:
我不知道这是否对任何人有帮助,但即使我做的事情看起来是对的,我也会遇到同样的问题。在我的main方法中,我有这样一个代码:

ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {
        "common.xml",
        "token.xml",
        "pep-config.xml" });
    TokenInitializer ti = context.getBean(TokenInitializer.class);

在一个 token.xml 我有一句话要说

<context:component-scan base-package="package.path"/>

我注意到package.path已经不存在了,所以我已经永远放弃了这一行。
在那之后,npe开始进来了。在一个 pep-config.xml 我只有两颗豆子:

<bean id="someAbac" class="com.pep.SomeAbac" init-method="init"/>
<bean id="settings" class="com.pep.Settings"/>

someabac类有一个声明为

@Autowired private Settings settings;

由于某些未知的原因,当 <context:component-scan/> 元素根本不存在,但是当它存在并且有一些bs作为基本包时,一切都正常。这条线现在看起来像这样:

<context:component-scan base-package="some.shit"/>

而且很有效。也许有人能提供一个解释,但对我来说现在已经足够了)

相关问题