spring自定义类中@AutoWired标识的元素注入为null
最近在做项目的时候,发现程序运行的时候有一个nullpointer exception,一脸懵逼因为感觉程序没什么逻辑。后来发现是因为new出来的component不会自动注入它的元素。
现象:@Component修饰的自定义普通类中@Autowired属性为null
原因:如果是通过new实例化的对象,脱离了Spring的管理,所以获取不到Spring注解的属性值。
在新线程中也会存在注解获取不到Spring管理的Bean,也是因为new出来的线程,脱离了Spring容器
我在实际开发中遇到有一段公共的代码,几个方法都需要掉,但如果单独拉出来写一个方法的话,入参又不同,所以想到了用泛型。
比如这是一段公共代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//保存订单信息,需要多个方法调用OrderFilterRequest orderFilterRequest = new OrderFilterRequest();btOrderFilterRequest.setUserId("1");btOrderFilterRequest.setStatus("0");List<Order> orderResultList = orderService.findOrders(orderFilterRequest);Order result = null;if(CollectionUtils.isEmpty(orderResultList )){ Order order = CopierUtils.convert(request, Order.class); order.setRealName(customer.getRealName()); order.setIdcardNo(customer.getIdcardNo()); order.setOrderNo("order" + DateUtil.getYMDHMS()); order.setStatus("0"); order.setCreateTime(new Date()); order.setUpdateTime(new Date()); order.setUserId("1"); result = orderService.createOrder(Order);}else{ Order orderResult = orderResultList.get(0); CopierUtils.copy(request, orderResult); orderResult.setUpdateTime(new Date()); result = orderService.updateOrder(btOrderResult);} |
将这段代码提炼成泛型类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@Transactional(readOnly = true)@Componentpublic class OrderRequest<T>{ @Autowired private OrderService orderService; @Transactional public Order orderInfoSave(T request) { OrderFilterRequest orderFilterRequest = new OrderFilterRequest(); btOrderFilterRequest.setUserId("1"); btOrderFilterRequest.setStatus("0"); List<Order> orderResultList = orderService.findOrders(orderFilterRequest); Order result = null; if(CollectionUtils.isEmpty(orderResultList )){ Order order = CopierUtils.convert(request, Order.class); order.setRealName(customer.getRealName()); order.setIdcardNo(customer.getIdcardNo()); order.setOrderNo("order" + DateUtil.getYMDHMS()); order.setStatus("0"); order.setCreateTime(new Date()); order.setUpdateTime(new Date()); order.setUserId("1"); result = orderService.createOrder(Order); }else{ Order orderResult = orderResultList.get(0); CopierUtils.copy(request, orderResult); orderResult.setUpdateTime(new Date()); result = orderService.updateOrder(btOrderResult); } return result; }} |
最开始我是这么调用的:
|
1
2
3
4
5
6
7
8
9
|
public void method1(Request1 request ) { OrderRequest<Request1> orderCreateRequest = new OrderRequest<Request1>(); Order result = OrderCreateRequest.orderInfoSave(request);}public void method2(Request2 request ) { OrderRequest<Request2> orderCreateRequest = new OrderRequest<Request2>(); Order result = OrderCreateRequest.orderInfoSave(request);} |
但是OrderRequest中orderService为null。(在controller层中注入service接口,在service层中注入orderService是有值的),尝试可很多解决办法,最后发现,原来spring自定义的类实例化时也需要用注入的方式,不能用new,否则脱离了spring的管理。改成如下方式就可以了:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
@Autowiredprivate OrderRequest<Request1> request1;@Autowiredprivate OrderRequest<Request2> request2;public void method1(Request1 request ) { Order result = request1.orderInfoSave(request);}public void method2(Request2 request ) { Order result = request2.orderInfoSave(request);} |
总结:
如果在A类中的属性b有@Autowired这样的注解,则类A的实例化不能用new 操作,必须要用注入的方式,否则脱离了spring的管理;
解决方法:
调用ApplicationContextUtil.getApplicationContext().getBean("XXX", XXX.class);方法获取component
spring自定义类中@AutoWired标识的元素注入为null的更多相关文章
- Spring自定义类扫描器 ClassPathScanningCandidateComponentProvider
项目中有个需求 读取xml文件,然后 对xml文件进行解析,比如如果是 Gender=0/1的话,分别代表男女. 所以需要在构造函数之后,初始化bean之前进行过滤解析 xml文件: <inte ...
- spring boot 中@Autowired注解无法自动注入的错误
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/huihuilovei/article/de ...
- 关于在App_Code文件夹自定义类中Session无法使用
由于前台页面需要调用App_Code中自定义类的函数,但在自定义类中找不到Session,解决方法如下: 新建一个类session,并自己定义函数GetSession(),引用命名空间 System. ...
- cocos2dx lua 绑定之一:自动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...
- Spring同一个类中的注解方法调用AOP失效问题总结
public interface XxxService { // a -> b void a(); void b(); } @Slf4j public class XxxServiceImpl ...
- 实体类相同属性间赋值与如何判断实体类中是否所有的字段都为null
1,实体类相同属性间赋值 /// <summary> /// 将实体2的值动态赋值给实体1(名称一样的属性进行赋值) /// </summary> /// <param ...
- Spring Boot + Netty 中 @Autowired, @Value 为空解决
问题描述 使用 Spring Boot + Netty 新建项目时 Handler 中的 @Autowired, @Value 注解的始终为空值 解决方法 @Component // 1. 添加 @C ...
- 关于工具类中@Autowired注入为NULL的问题记录
记录:在实体类中加入@Component注解和@Autowired注解时Service不能注入成功. @Component //把普通pojo实例化到spring容器中 0 public clas ...
- 于工具类中@Autowired注入为NULL的问题记录
记录:在实体类中加入@Component注解和@Autowired注解时Service不能注入成功. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
随机推荐
- 数据包编辑工具bittwiste
数据包编辑工具bittwiste bittwiste是数据包重放工具bittwist的一个工具.该工具可以编辑修改PCAP抓包文件.该工具提供数据包过滤功能,如根据范围和时间过滤.同时,该工具支持 ...
- 8.7 正睿暑期集训营 Day4
目录 2018.8.7 正睿暑期集训营 Day4 A 世界杯(贪心) B 数组(线段树) C 淘汰赛 考试代码 A B C 2018.8.7 正睿暑期集训营 Day4 时间:5h(实际) 期望得分:. ...
- BZOJ.1031.[JSOI2007]字符加密(后缀数组)
题目链接 环可以拆成链:对字符串排序能想到后缀数组. 完了.输出时忽略长度不足n的串,输出s[sa[i]+n-1],即排名为i的字符串的末尾. //4140kb 744ms #include < ...
- BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)
题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...
- [ZOJ3781]Paint the Grid Reloaded
思路: 先用DFS缩点,然后BFS找出每个点出发能到达的最长路,取$min$. 注意多组数据,初始化一定要仔细,刚开始存边的$e$忘记初始化,一直WA,调了半个晚上. 一开始和网上的题解对拍$T=1$ ...
- WEB应用从服务器主动推送Data到客户端有那些方式?
1) html5 websocket 2) WebSocket 通过 Flash 3) XHR长时间连接 4) XHR Multipart Streaming 5) 不可见的Iframe 6 ...
- 2015 年度新增开源软件排名 TOP 100 - 开源中国社区
2015 年度新增开源软件排名 TOP 100 - 开源中国社区 39.ABTestingGateway http://www.oschina.net/news/69808/2015-annual-r ...
- HDU 4788 Hard Disk Drive (2013成都H,水题)
Hard Disk Drive Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- gdb调试报错:Missing separate debuginfos, use: debuginfo-install glibc-XXX
解决方案: 1.先修改“/etc/yum.repos.d/CentOS-Debuginfo.repo”文件的 enable=1: 2.使用 sudo yum install glibc 安装: 3.使 ...
- OPENSSL FIPS
https://www.openssl.org/docs/fipsnotes.html https://wiki.openssl.org/index.php/FIPS_mode() openssl-f ...