Spring进阶(六):can not find proxy: set exposeproxy property on advised to make it available
文章目录
- 一、前言
- 二、实现方案
- 三、事务切换
一、前言
在项目启动后,页面点击时后台控制台出现如下错误提示,
can not find proxy: set exposeproxy property on advised to make it available
造成该问题原因是由于spring
声明事务失效引起的。
二、实现方案
spring
的aop
无法拦截内部方法调用时,解决方案之一是重新获取代理类调用B方法。
下面说一下如何获取到代理bean
。
如果知道
beanName
直接通过上下文获取到bean
。如果不知道
beanName
,则可以放在线程变量中,在action
中调用时可以先调用spring
提供的接口AopContext.setCurrentProxy(proxy)。
接口原理就是将代理bean
放到线程变量中。
public abstract class AopContext {private static final ThreadLocal<Object> currentProxy = new NamedThreadLocal<Object>("Current AOP proxy");public static Object currentProxy() throws IllegalStateException {Object proxy = currentProxy.get();if (proxy == null) {throw new IllegalStateException("Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.");}return proxy;}static Object setCurrentProxy(Object proxy) {Object old = currentProxy.get();if (proxy != null) {currentProxy.set(proxy);}else {currentProxy.remove();}return old;}}
当需要调用时,则调用接口((BeanClass) AopContext.currentProxy()).B();
如果在配置中将expose-proxy
设置为true
,则直接获取就可以了:
<aop:config expose-proxy="true"><!—xml风格支持-->
三、事务切换
接下来讲下spring aop
通过获取代理对象实现事务切换。
在项目中,当使用多数据源的时候,业务复杂的时候,会出现数据源A的方法里面嵌套调用数据源B的方法,这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop
注解在方法上通过加注解标识指定对应的数据源同时切换到对应的事务管理器,但是有这样的场景就不适用了,比如:数据源A的一个方法里面有调用数据源B的私有方法,这样的情况,如果还是通过方法上的注解就不行了,数据源B的方法也会走数据源A的事务管理器,这样的问题怎么解决呢?
答案是:通过spring aop
类里面的AopContext
类获取当前类的代理对象,这样就能切换对应的事务管理器了,具体做法如下:
(1) 在applicationContext.xml
文件中配置如下:
<!-- 开启暴露Aop代理到ThreadLocal支持 --><aop:aspectj-autoproxy expose-proxy="true"/>
(2) 在需要切换的地方获取代理对象,再调用对应的方法,如下:
((PercentageRepository) AopContext.currentProxy()).findByPost(percentagePost);
(3) 注意,这里需要被代理对象使用的方法必须是public
类型的方法,不然获取不到代理对象,会报下面的错误:
java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
(4) 通过查看AopContext.class
类的源代码得知,调用获取代理对象的方法必须是public
修饰的,如下源代码:
public static Object currentProxy() throws IllegalStateException {Object proxy = currentProxy.get();if (proxy == null) {throw new IllegalStateException("Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.");}return proxy;
}static Object setCurrentProxy(Object proxy) {Object old = currentProxy.get();if (proxy != null) {currentProxy.set(proxy);}else {currentProxy.remove();}return old;
}
Spring进阶(六):can not find proxy: set exposeproxy property on advised to make it available相关推荐
- 第五章 Spring进阶-注解方式实现AOP(1)
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 徒弟:师傅,我 ...
- Spring进阶知识点
Spring进阶知识点 注意:Spring这块可以参考网上的面试题复习. 重点:IOC,AOP,事务,事务传播行为,MVC运行流程. 1. Spring 1.1 复习Spring 什么是 Spring ...
- QIIME2进阶六_QIIME2训练分类器及物种注释
本文我们主要介绍了如何训练Naive Bayes分类器并把这个分类器应用于扩增子基因序列的物种注释与可视化. 本教程将使用来自人源化(humanized)小鼠的一组粪便样品,展示16S rRNA基因扩 ...
- GO语言的进阶之路-网络安全之proxy
GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...
- Spring进阶(十六)之spring生命周期
目录 Bean生命周期 阶段1:Bean元信息配置阶段 Bean信息定义4种方式 API的方式 XML的方式 properties文件的方式 注解的方式 小结 阶段2:Bean元信息解析阶段 Bean ...
- Java程序员从笨鸟到菜鸟之(七十四)细谈Spring(六)spring之AOP基本概念和配置详解
首先我们来看一下官方文档所给我们的关于AOP的一些概念性词语的解释: 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在 ...
- Spring学习(六)
AOP和OOP 1.OOP:Object-Oriented Programming,面向对象程序设计,是静态的,一旦类写死了就不能改变了,要更改就得修改代码重新编译,父类类型引用指向对象来实现动态性. ...
- 【Spring第六篇】注解:Annotation
注解:Annotation 首先不惜在spring容器配置中加上以下字段: <?xml version="1.0" encoding="UTF-8"?&g ...
- spring(六)AOP
springAOP 这是spring的另一个主要的核心功能,用来提供声明式事务:允许用户自定义切面.基本原理是动态代理,代理的是接口不是一个具体的类. 1.基本概念 切面(aspect):就是一个用来 ...
- spring进阶第三天之AOP
spring第三天之aop 在了解aop之前有必要先知道两个知识 静态代理和动态代理 静态代理 某个对象提供一个代理,代理角色固定,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在 ...
最新文章
- python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解
- 【CF913F】Strongly Connected Tournament 概率神题
- java数_java大数
- python知识笔记_[Python笔记]第一篇:基础知识
- 开源组件XStream 修复11个漏洞并公开 PoC
- Codeforces Round #666 (Div. 2)B. Power Sequence(等比数列)
- 软件发布!DOTA2统计学
- 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
- Word如何快速绘制你需要的作文稿纸
- linux之linux下载软件包
- 图扑智慧交通:数字化地铁大屏管控运维平台
- 实对称矩阵一定可以对角化
- 立创商城PCB库使用说明
- Complex Multiplier IP 使用教程(源码)
- 【管理篇 / 诊断】❀ 01. 了解防火墙的性能参数 ❀ FortiGate 防火墙
- 前辈们的面试经验总结——对于BAT等企业如何面试之面试流程及问题解析、以及面试时的基本礼仪及着装
- [小说连载]张小庆,在路上(11)- 产品还是项目?
- 一个公众号可以绑定几个小程序_微信开放平台可以绑定几个小程序和公众号?...
- OpenInfra Days China 2020大会议程已上线,快来报名参加!
- 圆弧防线用计算机怎么算,一种圆弧形放线工具的制作方法
热门文章
- Laravel 5.5 Eloquent ORM - 关联关系
- docker minio部署作为shareX截图软件的图床
- 医院基本流程-挂号收费
- C_Primer第12章 存储类型、链接和内存管理
- Android编译gradle提示A problem occurred evaluating project ':example'.
- 电子基础知识:测判三极管的口诀
- 仙人掌树学习1:仙人掌图	洛谷:[SHOI2008]仙人掌图 II
- BT401蓝牙模块KT1025A蓝牙芯片用户修改BLE的广播包数据的说明以及方法
- 如何打造VUCA时代的敏捷型组织?
- xxl-job定时任务