Запретить кеширование Spring для определенного класса

В некотором коде есть метод интерфейса с кешируемой аннотацией 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 из интерфейса недоступно.


person M. Jessup    schedule 03.11.2011    source источник


Ответы (1)


@Cacheable имеет функцию условного кэширования (см. 35.3.1 Условное кеширование). Условный параметр принимает выражение SpEL.

interface Foo {
    @Cacheable(condition = "doCache")
    Widget doit(boolean doCache);
}

Параметр doCache (или более элегантный SpEL) можно использовать для управления кешированием. Типы могут быть сопоставлены как foo instanceof T(Bar).

Надеюсь это поможет.

person jeha    schedule 03.11.2011