3.Sprint 代理对象与原始对象的异常错误
代码案例分析
- 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;
3.Sprint 代理对象与原始对象的异常错误的更多相关文章
- jQuery 工具类函数-检测对象是否为原始对象
调用名为$.isPlainObject的工具函数,能检测对象是否为通过{}或new Object()关键字创建的原始对象,如果是,返回true,否则,返回false值,调用格式为: $.isPlain ...
- AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象
现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...
- 《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-6 获取原始对象 问题 你正在使用POCO,想从数据库获取原始对象. 解决方案 ...
- Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
- js valueOf()函数用于返回指定对象的原始值
valueOf()函数用于返回指定对象的原始值. 该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法. 对象 返回 ...
- JavaScript中对象转换为原始值的规则
JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 深入剖析JavaScript中的对象与原始值之间的转换机制
我们都知道原始值之间是可以互相转换的,但是如果对象转原始值呢? 所有的对象在布尔上下文(context)中均为 true .所以对于对象,不存在 to-boolean 转换, 只有字符串和数值转换. ...
随机推荐
- Git添加和克隆远程库
首先我们得有一个GitHub账号,然后把当前电脑的SSH Key添加到GitHub上面 第1步:创建SSH Key.在用户主目录下(可用 “cd ~”进入用户主目录),看看有没有.ssh目录,如果有, ...
- python3 利用VideoCapture模块读取多个相机名称
模块pip安装地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#videocapture
- 【Python下进程同步之互斥锁、信号量、事件机制】
" 一.锁机制: multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的 ...
- 使用Eclipse工具开发Servlet(新建web项目->创建Servlet->部署和访问Servlet)
在Eclipse工具栏中的[File]->[New]->[Other],打开如下菜单栏,选择Dynamic Web Project 点击下一步,如下图所示: 这里Dynamic web m ...
- python中安装下载超时,下载不了安装包
python3 -m pip install scapy 执行上面命令报错,下载超时,下载不了安装包 Collecting scapy WARNING: Retrying (Retry(total=4 ...
- RS232与RS485
1.RS232实物图与引脚图? 2.RS485实物图与引脚图?
- vue-lazyload 的使用(vue图片懒加载)
github地址:https://github.com/hilongjw/vue-lazyload npm i vue-lazyload -S 或者 <script src="http ...
- 实现简单ORM案例
ORM框架: • 我们希望设计一个可以实现对象和SQL自动映射的框架,但是整体用法和设计比Hibernate简单.砍掉不必要的功能.• 会穿插使用设计模式• 增加 – 将对象对应成sql语句,执行sq ...
- springboot @Select @Insert @Update @Delete
https://blog.csdn.net/qq_20867981/article/details/80641353 使用@Select.@Insert.@Update.@Delete注解代替xxxM ...
- HTTP接口调用方式
1.get方式,设置调用方式为get,参数直接在url中包含,直接调用获取返回值即可 2.post方式,content为application/x-www-form-urlencoded ,参数格式 ...