我有一个使用ehcache进行缓存的应用程序(但我认为这个问题与框架无关),使用方法拦截器,所以基本上如果我标记我的方法来缓存类似于这样的事情:
public Object invoke(MethodInvocation mi) throws Throwable {
Object result = cache.get(key);
//key comes from MethodInvocation processing
if (result == null) {
result = mi.proceed();
cache.put(key, result);
}
return result;
}
到目前为止一切顺利。我正在缓存一个返回Array
的方法,并像这样被调用:
List<Object> result = methodWithCaching();
result.add(new Object()); //!
可以想象,标有!
的行也会更新缓存实例,这不是我想要的。
有人可以想办法在不修改客户端的情况下停止此行为,只有拦截器吗?
答案 0 :(得分:0)
“更新缓存”是什么意思?您是否担心用户可以修改methodWithCaching()返回的List?如果是这样,我会建议该方法返回一个不可修改的集合。或者缓存可能会检测到结果是一个Collection并用一个不可修改的包装器包装它。
答案 1 :(得分:0)
我的理解是你希望拦截器返回缓存结果的副本,这样任何客户端修改只会影响副本吗?
尽管说实话,我想不出一个好的和一般的方法。丑陋的将是依赖clone()
,或每次都创建一个新的列表。
听起来你应该真的修改客户端,如果可能的话。