代码案例分析

  • 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 代理对象与原始对象的异常错误的更多相关文章

  1. jQuery 工具类函数-检测对象是否为原始对象

    调用名为$.isPlainObject的工具函数,能检测对象是否为通过{}或new Object()关键字创建的原始对象,如果是,返回true,否则,返回false值,调用格式为: $.isPlain ...

  2. AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象

    现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-6  获取原始对象 问题 你正在使用POCO,想从数据库获取原始对象. 解决方案 ...

  4. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  5. C# Emit动态代理生成一个实体对象

    /// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...

  6. js valueOf()函数用于返回指定对象的原始值

    valueOf()函数用于返回指定对象的原始值. 该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎所有的实例对象都可以使用该方法. 对象 返回 ...

  7. JavaScript中对象转换为原始值的规则

    JavaScript中对象转换为原始值遵循哪些原则? P52 对象到布尔值对象到布尔值的转换非常简单:所有的对象(包括数字和函数)都转换为true.对于包装对象亦是如此:new Boolean(fal ...

  8. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 深入剖析JavaScript中的对象与原始值之间的转换机制

    我们都知道原始值之间是可以互相转换的,但是如果对象转原始值呢? 所有的对象在布尔上下文(context)中均为 true .所以对于对象,不存在 to-boolean 转换, 只有字符串和数值转换. ...

随机推荐

  1. oracle 12cR2 RAC deconfig CRS过程记录

    已经停了该节点的crs所有服务: [root@jhjzksrv02 install]# ./rootcrs.sh -force -deconfig -verboseUsing configuratio ...

  2. [Linux kali] linux kali [KDE]一些软件切换输入法无效

    #开始 今天最终是在实体机安装了Kali Kali的默认桌面是GNOME桌面 但是用久了windows桌面用这个实在是不习惯 然后看到了kali有自带KDE版本的 然后就下载了一个尝尝鲜 之前在Deb ...

  3. 80端口被system占用

    # 开始 今天配置wampserver 3.0.6的时候 发现右下角的图标一直是红色的 经验告诉我两个服务都没有运行 # 解决思路 wampserver有两个服务 一个是 Apache 服务 一个是 ...

  4. docker安装后启动报错

    docker安装后启动不起来: 查看日志  /var/log/message    其中有一行为:  Your kernel does not support cgroup memory limit ...

  5. 树莓派raspbian安装matchbox-keyboard虚拟键盘

    环境:raspbian-stretch(2018-06-27) 树莓派:3代B型 官网安装地址:http://ozzmaker.com/virtual-keyboard-for-the-raspber ...

  6. Java面向对象编程 -6.4

    二维数组 数组的定义格式 数组的动态初始化:初始化之后数组中的每一个元素的保存的内容为其对应数据类型的默认值 声明并初始化数组: 数据类型 数组名称 [][] = new 数据类型[行个数][列个数] ...

  7. Java面向对象编程 -6.2

    数组的引用传递 通过数组的基本定义可以发现,在数组使用的过程中依然需要使用new进行内存空间的开辟,同理,那么也一定存在有内存的关系匹配问题. 但是数组本身毕竟属于引用数据类型,那么既然是引用数据类型 ...

  8. TOMCAT中文信息乱码改为GBK

    # Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements ...

  9. POJ 1274 The Perfect Stall(二分图 && 匈牙利 && 最小点覆盖)

    嗯... 题目链接:http://poj.org/problem?id=1274 一道很经典的匈牙利算法的题目: 将每只奶牛看成二分图中左边的点,将牛圈看成二分图中右边的点,如果奶牛看上某个牛圈,就将 ...

  10. P1579

    AC: #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < b ...