0

我使用了基于弹簧声明性注释的缓存方法。以下是我的使用方法,

@Cacheable(value = "users", key = "T(org.mifosplatform.infrastructure.core.service.ThreadLocalContextUtil).getTenant().getName().concat(#username)")
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException, DataAccessException { //method body }

这个注释看起来很长。我尝试使用自定义键生成器,但问题是当我在注释中定义键时,自定义键生成器不会被调用。

所以现在我正在尝试使用自定义弹簧注释作为解决方法。但我无法找到一个好的参考来开始。基本上我需要向密钥(租户标识符)添加一个上下文感知参数。

任何帮助将不胜感激。

4

1 回答 1

0

Key 必须是静态变量。它不能是运行时评估。您需要覆盖 CacheManager 然后进行修改。下面是我扩展 HazelcastCacheManager 的示例,它又扩展了 spring 的 Cachemanager

public class MyCache extends HazelcastCacheManager {

    private final ConcurrentMap<String, Cache> myCaches = new ConcurrentHashMap<String, Cache>();

    public MyCache(){
        super();
    }


    public MyCache(HazelcastInstance hazelcastInstance){
        super(hazelcastInstance);
    }
    @Override
    public Cache getCache(String name) {

        String tenant = org.mifosplatform.infrastructure.core.service.ThreadLocalContextUtil).getTenant().getName();
        Cache cache = myCaches.get(tenant.concat("#").concat(name));
        if (cache == null) {
            IMap<Object, Object> map = getHazelcastInstance().getMap(tenant.concat("#").concat(name));
            cache = new HazelcastCache(map);
            Cache currentCache = cesCaches.putIfAbsent(tenant.concat("#").concat(name), cache);
            if (currentCache != null) {
                cache = currentCache;
            }
        }

        return (Cache)cache;
    }
于 2018-05-31T14:16:36.517 回答