我有这个对象:
@Service
public class myBr {
@PostFilter("filterObject.cellule.getId()==2")
public List<Bibliotheque> getB() {
return super.getAll();
}
public List<Bibliotheque> getA() {
return getB();
}
}
Run Code Online (Sandbox Code Playgroud)
当我从测试中调用时myBr.getB(),@PostFilter会应用,但是当我调用时myBr.getA(),后置过滤器不起作用.
有没有办法处理这个,以便应用过滤器?
Don*_*ows 10
问题是,@PostFilter通过AOP技术应用,但您呼叫的实例的执行getB()直接getA()和Spring AOP的不重写类.
这是发生了什么:
+————————+ +——————————+
getA | pass | getA | |
—————>|·······>|—————>| |———+
| | | | |
| Bean | | Instance | | this.getB
| | | | |
getB | filter | getB | | |
—————>|·······>|—————>| |<——+
| | | |
+————————+ +——————————+
Run Code Online (Sandbox Code Playgroud)
Spring AOP将代理对象作为委托给bean的实际bean,通过使用JDK代理对象(当你有一个合适的接口时)或者使用CGLIB来重新合成对象.因为getA它直接通过,因为getB它将调用插入后过滤代码.这很好,但它确实意味着当实例 - 你在this里面得到的对象getA- 用于getB直接调用时,它会跳过过滤器并直接跳转到底层代码.
有四种可能的修复方法.
getB通过它调用.getB不同的豆子.我自己使用了#2选项(在我的特定情况下它比其他选项更容易)并且它运行得很好,但最好的选择几乎肯定是#3,所以你不需要自己调用"界面"方法; 这种事情通常表明应用程序功能的分区不正确.
| 归档时间: |
|
| 查看次数: |
4438 次 |
| 最近记录: |