首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的Spring @Autowired字段为空?

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

提问于 2017-12-26 03:43:41
回答 2关注 0查看 627

我有一个Spring @Service类(MileageFeeCalculator)有一个@Autowired字段(rateService),但字段是null当我尝试使用它。日志显示MileageFeeCalculatorbean和MileageRateServicebean都被创建,但是NullPointerException每当我尝试调用mileageCharge我的服务bean上的方法时,我都会得到它。Spring为什么不自动装配这个字段?

控制器类:

代码语言:txt
AI代码解释
复制
@Controlle
代码语言:txt
AI代码解释
复制
public class MileageFeeController {    
代码语言:txt
AI代码解释
复制
    @RequestMapping("/mileage/{miles}")
代码语言:txt
AI代码解释
复制
    @ResponseBody
代码语言:txt
AI代码解释
复制
    public float mileageFee(@PathVariable int miles) {
代码语言:txt
AI代码解释
复制
        MileageFeeCalculator calc = new MileageFeeCalculator();
代码语言:txt
AI代码解释
复制
        return calc.mileageCharge(miles);
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

服务等级:

代码语言:txt
AI代码解释
复制
@Service
代码语言:txt
AI代码解释
复制
public class MileageFeeCalculator {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    @Autowired
代码语言:txt
AI代码解释
复制
    private MileageRateService rateService; // <--- should be autowired, is null
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    public float mileageCharge(final int miles) {
代码语言:txt
AI代码解释
复制
        return (miles * rateService.ratePerMile()); // <--- throws NPE
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

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

代码语言:txt
AI代码解释
复制
@Service
代码语言:txt
AI代码解释
复制
public class MileageRateService {
代码语言:txt
AI代码解释
复制
    public float ratePerMile() {
代码语言:txt
AI代码解释
复制
        return 0.565f;
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

当我尝试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)

...

回答 2

不知雨

发布于 2017-12-26 03:51:35

你应该使用JVM管理对象或Spring管理对象来调用方法。从你的控制器类的上面的代码,你正在创建新的对象来调用你的服务类,它有自动有线对象。

MileageFeeCalculator calc = new MileageFeeCalculator();

所以它不会那样工作。

解决方案是将此MileageFeeCalculator作为控制器本身的自动装配对象。

像下面那样改变你的Controller类。

代码语言:txt
AI代码解释
复制
@Controlle
代码语言:txt
AI代码解释
复制
public class MileageFeeController {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    @Autowired
代码语言:txt
AI代码解释
复制
    MileageFeeCalculator calc;  
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    @RequestMapping("/mileage/{miles}")
代码语言:txt
AI代码解释
复制
    @ResponseBody
代码语言:txt
AI代码解释
复制
    public float mileageFee(@PathVariable int miles) {
代码语言:txt
AI代码解释
复制
        return calc.mileageCharge(miles);
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

最爱开车啦

发布于 2017-12-26 03:51:18

如果你没有编写一个web应用程序,确保你的@Autowiring类是一个spring bean。通常情况下,春天容器不会意识到我们可能认为的春天豆类。我们必须告诉Spring容器关于我们的Spring类。

这可以通过在appln-contxt中进行配置来实现,或者更好的方法是将class注释为@Component,并且不要使用new运算符创建带注释的类。确保你从Appln-context获取它如下。

代码语言:txt
AI代码解释
复制
@Component
代码语言:txt
AI代码解释
复制
public class MyDemo {
代码语言:txt
复制
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    @Autowired
代码语言:txt
AI代码解释
复制
    private MyService  myService; 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    /**
代码语言:txt
AI代码解释
复制
     * @param args
代码语言:txt
AI代码解释
复制
     */
代码语言:txt
AI代码解释
复制
    public static void main(String[] args) {
代码语言:txt
AI代码解释
复制
        // TODO Auto-generated method stub
代码语言:txt
AI代码解释
复制
            System.out.println("test");
代码语言:txt
AI代码解释
复制
            ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
代码语言:txt
AI代码解释
复制
            System.out.println("ctx>>"+ctx);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
            Customer c1=null;
代码语言:txt
AI代码解释
复制
            MyDemo myDemo=ctx.getBean(MyDemo.class);
代码语言:txt
AI代码解释
复制
            System.out.println(myDemo);
代码语言:txt
AI代码解释
复制
            myDemo.callService(ctx);
代码语言:txt
复制
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    public void callService(ApplicationContext ctx) {
代码语言:txt
AI代码解释
复制
        // TODO Auto-generated method stub
代码语言:txt
AI代码解释
复制
        System.out.println("---callService---");
代码语言:txt
AI代码解释
复制
        System.out.println(myService);
代码语言:txt
AI代码解释
复制
        myService.callMydao();
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
}
和开发者交流更多问题细节吧,去 写回答
相关文章
两个原因导致Spring @Autowired注入的组件为空
原文链接:https://www.moreofless.co.uk/spring-mvc-java-autowired-component-null-repository-service/
三分恶
2020/07/17
8.7K0
spring boot项目中handlerinterceptor autowired 为空解决办法
在我们使用拦截器的时候,有时候需要使用bean对象,这个时候,如果我们直接使用了@autowired或者是@Resource注解的的时候,发现对象为空。是什么原因导致的呢?
凯哥Java
2022/12/16
8890
spring boot项目中handlerinterceptor autowired 为空解决办法
解惑 | 为什么我根据时间戳获得的offset为空呢?
最近有一个需求,要查询某一时间戳对应的offset值,于是就想到了使用 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --time <timestamp> ,但是我在测试的时候,发现有的时间戳会获取不到offset,是空。但是明明指定的时间戳有上报数据,肯定有对应的 offset 的。于是就谷歌,找到了这篇帖子:
create17
2020/09/24
3K0
mysql float字段类型数据查询为空问题
作者:matrix 被围观: 224 次 发布时间:2021-12-28 分类:mysql PHP | 无评论 »
HHTjim 部落格
2022/09/26
5.8K0
为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解?
大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如下警告
终码一生
2022/10/28
7780
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
原因详情描述: Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies". 译为: Spring 团队建议: 始终在您的 bean 中使用基于构造函数的依赖注入。始终对强制依赖项使用断言
时间静止不是简史
2022/04/02
1.7K0
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解
大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如下警告
BinGo_Blog
2022/11/01
5600
手写Spring的@Autowired注解
在使用Spring框架时,我们经常会用到@Autowired注解,也就是自动装配的意思。
Defu Li
2020/05/28
7780
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/09/07
5000
为什么 Spring和IDEA 都不推荐使用 @Autowired 注解
Spring @Autowired npe example:Why your Spring @Autowired component is null
找原因,找了大半天, 也翻了Spring MVC的源码。。。终于,灵机一动,看到了 private :
一个会写诗的程序员
2020/09/11
1.4K0
Spring @Autowired npe example:Why your Spring @Autowired component is null
Spring Data 测试时的 Repository 提示为空对象
上面的错误信息提示的就是因为 userRepository 为空,我们不能进行数据库有关的操作。
HoneyMoose
2022/08/26
1.6K0
Spring Data 测试时的 Repository 提示为空对象
取消IDEA的Autowired对字段注解告警
?
JavaEdge
2021/02/23
6200
取消IDEA的Autowired对字段注解告警
为什么 spring 中,不支持 autowired 静态变量?
因为静态变量是属于本身类的信息,当类加载器加载静态变量时,Spring 的上下文环境还没有被加载,所以不可能为静态变量绑定值。
水货程序员
2018/11/13
1.6K0
为什么spring不推荐@Autowired注入,提示:Field injection is not recommended
想必你在项目中使用如下代码时经常会看到idea提示了一个警告:Field injection is not recommended
诺浅
2020/08/20
4.8K0
聊聊Spring中的@Autowired注解
今天来跟大家聊聊简单聊聊@Autowired,Autowired翻译过来为自动装配,也就是自动给Bean对象的属性赋值。
每周聚焦
2023/02/14
4000
Oracle数据库sql语句空字段筛选方法,sql语句值为空判断方法
空字段筛选过程演示: select image_src, pk_group from sm_appmenuitem where image_src is null;
小蓝枣
2021/12/01
3.3K0
Oracle数据库sql语句空字段筛选方法,sql语句值为空判断方法
Spring中@Autowired和@Resource的区别
最近有非常多的小伙伴从大厂毕业了,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。
Tom弹架构
2022/08/22
3390
Spring中@Autowired和@Resource的区别
Springboot@Autowired注入为Null
SpringBoot项目,在获取resources中application.properties配置文件中的内容时,使用注入Environment方法获取,启动项目之后发现注入的Environment一直为null
itze
2022/10/31
1.3K0
Spring注解-@Autowired注解使用
首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName、byType、constructor和autodetect;比如byName,不用显式的在bean中写出依赖的对象,它会自动的匹配其它bean中id名与本bean的set**相同的,并自动装载。 @Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。 两者的功能是一样的,就是能减少或者消除属性或构造器参数的设置,只是配置地方不一样而已。 autowire四种模式的区别
SerMs
2022/04/11
1.1K0
Spring注解-@Autowired注解使用
UrlReferrer为空的问题?
官方解释:获取有关客户端上次请求的 URL 的信息,该请求链接到当前的 URL。 1.也就是说,如果用Request.Redirect之后,再用Request.UrlReferrer是得不到前一个页面的链接的,因为这不是客户端的请求。 2.既然服务端不行,那换个思路:在客户端用js导航如何?比如下面这样 A.aspx上用window.location='B.aspx' 但实践证明在B.aspx上用Request.UrlReferrer仍然为空,即js导航也不行! 3.用A链接试一下 A.aspx上写一段ht
菩提树下的杨过
2018/01/23
2.8K0

相似问题

为什么云函数返回的result为空?

1889

配置均衡负载,LB实例为空,为什么?

1415

为什么蓝牙配网引入"BlueToothAdapter"为空?

0105

HmilyTransactionContext为空异常 ?

1153

为什么我请求完毕后返回的结果都是0或者空?

2599
相关问答用户
某公司 | 程序员擅长1个领域
腾讯云TDP | 先锋会员擅长2个领域
新浪微博 | 高级总监擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档