В некотором коде есть метод интерфейса с кешируемой аннотацией Spring. У меня есть декоратор класса, который изменяет этот метод. Код в основном
interface Foo {
@Cacheable
Widget doit();
}
class StandardFoo implements Foo {
public Widget doit();
}
class FooDecorator implements Foo {
Foo decorated;
public Widget doit() {
Widget = decorated.doit();
..some fun stuff
return new SlightlyDifferentWidget();
}
}
Моя проблема возникает, когда во время цепочки вызовов вызывается декоратор, а затем вызывается украшенный объект. Затем Spring (или Ehcache) решает кэшировать объекты, возвращаемые декорированным экземпляром. FooDecorator
затем успешно возвращает измененный виджет в первый раз.
При втором вызове Spring видит вызов Foo.doit()
(который на самом деле является FooDecorator.doit()
) и возвращает кэшированные объекты (которые являются ошибочными значениями из StandardFoo.doit()
).
Поэтому я хотел бы добавить где-нибудь конфигурацию, которая сообщает Spring / Ehcache о необходимости кэшировать только значения из DecoratedFoo
или не кэшировать значение, возвращаемое другой реализацией.
Обратите внимание, что удаление аннотации @Cacheable
из интерфейса недоступно.