我有一项服务,我想使其可缓存。我一直在研究grails-cache 插件,它看起来很有希望,但它会导致一些我不理解的行为。
考虑以下服务:
class FooService {
def contentService
@Listener
void processFoo(Foo foo) {
doStuff(foo)
foo.save(failOnError: true)
}
private void doStuff(Foo foo) {
contentService.evaluate(foo.name)
}
}
现在这里是ContentService
定义:
class ContentService {
Object findSource(String name) {
Content.findByPath(name) ?: Content.findByPath(stripLocale(name))
}
String evaluate(String name) {
....
}
}
在我尝试添加缓存之前,这一切都很好。首先,我在 Config.groovy 中设置它:
grails.cache.config = {
cache {
name 'content'
}
}
然后在我的 ContentService 中,我注释了我的方法:
@Cacheable('content')
Object findSource(String name) {
Content.findByPath(name) ?: Content.findByPath(stripLocale(name))
}
进行这些更改后,我的processFoo
方法成功执行每一行代码,然后在退出时抛出其中一个:
非法 arg 调用 java.lang.reflect.InvocationTargetException org.springframework.transaction.UnexpectedRollbackException:事务回滚,因为它已被标记为仅回滚
最让我困惑的是,带有@Cacheable
注释的方法甚至没有被 my FooService
. 仅evaluate()
调用该方法,并且该方法似乎没有问题。为什么将此注释添加到甚至未在此执行中使用的方法会导致事务回滚?