Springboot 用 @Autowired 的坑

2019-05-22 21:25:42 +08:00
 gramyang
我想很多老铁可能都碰到过,就是在 springboot 的非 controller 中使用 @Autowired 引发的空指针。

我这里的 handler 报空指针:

public class NettyHandler extends ChannelInboundHandlerAdapter {
private ConcurrentHashMap<Long, Channel> channelMap;
private Long key = System.currentTimeMillis();
@Autowired
private PlayerInfoHandler handler;

查了一下,不少人都遇到过这样的问题,一个解决方法: https://blog.csdn.net/georgeshaw1/article/details/74943089

代码:
@Autowired
protected HealthDataService healthDataService;
private static ServerHandler serverHandler ;
@PostConstruct //通过 @PostConstruct 实现初始化 bean 之前进行的操作
public void init() {
serverHandler = this;
serverHandler.healthDataService = this.healthDataService;
// 初使化时将已静态化的 testService 实例化
}

我这边试了一下不行啊。。。。咋搞呢??
10698 次点击
所在节点    Java
37 条回复
Lonely
2019-05-22 21:35:54 +08:00
你这 handler 有注册为 bean 吗?
feiyuanqiu
2019-05-22 21:37:05 +08:00
类上加个 @Component 或者 @Service 试试
reeco
2019-05-22 21:39:35 +08:00
只有被 Spring 管理起来的 bean 才能使用注入,你这个类压根没被 Spring 管理,@Autowired 默认 required 是 true,注入是 null 直接启动失败了
szq8014
2019-05-22 21:40:40 +08:00
怀疑你不了解 Spring,handler 都没让 Spring 来管理怎么能注入成功?要么把 handler 交给 Spring 来管理,要么拿到 ApplicationContext 然后 getBean(HealthDataService.class) 这样拿到 HealthDataService 实例使用
jamesxu
2019-05-22 21:43:08 +08:00
这不算坑
npe
2019-05-22 21:44:47 +08:00
Spring 容器里都没这个类,你能注入个啥?
aragakiyuii
2019-05-22 21:56:52 +08:00
你找的这个不是说的挺清楚的嘛。。
在你的 NettyHandler 类上加 @Component 或者 @Service,并且要保证你注入的 PlayerInfoHandler 这个类或者接口实现也交给 spring 管理了
telami
2019-05-22 22:04:25 +08:00
emmmm..
gramyang
2019-05-22 22:29:13 +08:00
@szq8014 确实 spring 用的不多
NewDraw
2019-05-22 22:48:22 +08:00
哥们你太有意思了😄😄😄😄
Umenezumi
2019-05-22 22:49:41 +08:00
PlayerInfoHandler handler 你这个类没有被 spring 管理啊。。自动注入 required 默认是 true 自然报错
trycatch
2019-05-22 22:50:36 +08:00
最好用构造函数注入
serical
2019-05-22 22:55:36 +08:00
静态的通过 set 方法注入
qwerthhusn
2019-05-22 23:08:05 +08:00
BTW,如果把 Handler 注册成 Bean,并且是单例的话,
别忘了加上注解 @Shared,Netty 好像对 @Shared 有处理,标记为可重用的 Handler
gramyang
2019-05-22 23:10:27 +08:00
@qwerthhusn 基本上,netty 的业务 handler 是不会用到 @Sharable 的,所以我已经加上了
gramyang
2019-05-22 23:50:31 +08:00
@qwerthhusn 不对,我上一句话说的有语病。
handler 我不想加上 @Sharable,因为不是线程安全的。但是我这个是一个用 netty 写的持久化服务器,所以是线程安全的,可以加上 @Sharable
wc951
2019-05-23 06:33:00 +08:00
用构造器注入就不会出现你这种疑惑,因为直接启动就失败了,这也是 spring 官方推荐构造器注入的原因
brust
2019-05-23 08:16:50 +08:00
用 spring4.0 出现过这种情况,但是 springboot 我还没遇到过,可以说下你的 spring 版本吗
tedzhou1221
2019-05-23 08:17:08 +08:00
题外话:建议你用 idea,或者学习怎么用。
当前类如果被 spring 管理的话,左边是有绿色的叶子,.
@Autowired 如果生效的话左边也有绿色的豆子(Bean)

所以大部分情况下,有没有注入成功,一眼就看出来
brust
2019-05-23 08:18:12 +08:00
我当时的解决方法是吧 @Autowired 换成 @resource

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566727

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX