Spring缓存支持i18n服务

时间:2015-01-14 14:57:05

标签: java spring caching

我使用Spring的@Cachable注释支持来加速检索服务提供的某些数据。

我的部分服务'调用依赖于LocaleContextHolder.getLocale()方法来检索例如附加到当前线程的Locale

这些服务返回的内容是国际化的,但Locale不是我的服务方法签名的一部分,因此它不作为缓存解决方案的密钥生成机制的参数。< / p>

当然并非所有的Service调用都必须支持i18n,因此在这些情况下缓存的数据和密钥生成可能与Locale无关。

是否有一种快速方法可以改变使用LocaleContextHolder功能返回i18n内容的特定服务方法的密钥生成?

我看到了用于创建密钥的通用KeyGenerator接口,但如果服务未使用国际化,这会影响所有服务调用缓存相同数据的次数。

我应该简单地覆盖密钥生成,例如将语言环境附加到我的参数上吗?

@Cacheable(value = "someName", key = "#p0.concat('-').concat(T(org.springframework.context.i18n.LocaleContextHolder).getLocale().toLanguageTag())")

当我需要从缓存中删除内容时,此解决方案存在问题,因为我无法将@CacheEvictkey="p0.concat('-*')"之类的通配符一起使用来匹配缓存的所有本地化实例

任何建议都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

对于您的情况,我建议使用keyGenerator而不是使用SpEL表达式的key属性。像这样:

@Cacheable(value = "cacheName",  keyGenerator="localizedGenerator")

首先,这将从静态方法调用中抽象出密钥生成,其次,如果需要,您可以使用keyGenerator根据区域设置和其他参数驱逐操作。 KeyGenerator足够灵活,可以访问所有运行时数据,因此您可以确定是否以及何时访问本地化资源

@CacheEvict (value = "cacheName",  keyGenerator="localizedGenerator")

可以在doc http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html

中查看一些基本样本