3.Sprint 代理对象与原始对象的异常错误
2024-09-05 12:49:59
代码案例分析
- Service层添加了注解@Transactional
@Service
@Transactional
public class CustomerService extends BaseService<CustomerModel, CustomerQueryModel> implements ICustomerService {
private CustomerDAO dao = null;
@Autowired
public void setDao(CustomerDAO dao) {
this.dao = dao;
super.setDao(dao);
}
}
- Client端同时也增加了注解@Transactional
@Service
@Transactional
public class Client {
@Autowired
private ICustomerService s = null; public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Client t = (Client)ctx.getBean("client"); // CustomerModel cm = new CustomerModel();
// cm.setCustomerId("c1");
// cm.setPwd("c1");
// cm.setRegisterTime("");
// cm.setShowName("c1");
// cm.setTrueName("王五");
//
// t.dao.create(cm); CustomerQueryModel cqm = new CustomerQueryModel();
cqm.getPage().setNowPage(1); Page<CustomerModel> p = t.s.getByConditionPage(cqm); System.out.println("p=="+p);
}
}
- 异常空指针错误信息
Exception in thread "main" java.lang.NullPointerException
at com.sishuok.architecture1.customermgr.Client.main(Client.java:38)
Client.java:38行报的异常错误信息,就是Page<CustomerModel> p = t.s.getByConditionPage(cqm);
经过分析,t对象肯定存在,只有s对象存在空指针,为什么呢?
原因是因为增加了@Transactional 之后,又被代理了一次,意思就是sprint的原始对象与代理对象的问题,s的原始对象是有的,但是t.s拿到的是@Transactional 代理过后的对象,t.s 和s 不是同一个对象,解决办法如下
@Service
@Transactional
public class Client {
@Autowired
private ICustomerService s = null; public ICustomerService getS() {
return s;
} public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Client t = (Client)ctx.getBean("client"); // CustomerModel cm = new CustomerModel();
// cm.setCustomerId("c1");
// cm.setPwd("c1");
// cm.setRegisterTime("");
// cm.setShowName("c1");
// cm.setTrueName("王五");
//
// t.dao.create(cm); CustomerQueryModel cqm = new CustomerQueryModel();
cqm.getPage().setNowPage(1); // Page<CustomerModel> p = t.s.getByConditionPage(cqm); Page<CustomerModel> p = t.getS().getByConditionPage(cqm); System.out.println("p=="+p);
}
一切正常,为什么可以解决?代理的时候通过方法进行访问(拦截的方法),属性的就没有正常的代理private ICustomerService s = null;
最新文章
- POJ 2337 Catenyms(有向图的欧拉通路)
- barManager 挤压后“ 自动换行”和“自动隐藏”的实现方法
- 使用Git命令上传本地项目
- UICollectionReusableView 使用时的一些问题
- [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
- rsync安装使用
- HDU 4493 Tutor (控制精度)
- Apache Shiro 使用手册
- 【POJ3461】【KMP】Oulipo
- Grub禁用UUID
- python爬虫框架scrapy问题的解决
- FORM开发两种方式实现动态LIST
- 关于Opengl投影矩阵
- 前端开发【第二篇: css】
- DB2(Procedure)存储过程遍历循环!
- 检查服务器主从状态的脚本-check_server_state.sh
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory Android
- purge recyclebin之后dba_segments仍然有BIN$段
- thinkphp5使用redis
- Android中数据的保存
热门文章
- EVE上传Dynamips、IOL和QEMU镜像
- 【译】高级T-SQL进阶系列 (三)【中篇】:理解公共表表达式(CTEs)
- 使用PIE.htc 进行IE兼容CSS3
- $.extend({},旧的,新的);合并对象,后面的覆盖前面的
- 最新版自动检测卡片类型工具软件版本(auto check card type v3.2.0)
- 将信息存储在claim中,通过扩展AbpSession取出
- mongdb 复制集
- EasyUI tree的三种选中状态
- 例题3_4 猜数字游戏的提示(UVa340)
- Python:数值类型