2016-01-10 5 views
1

Я хотел бы узнать, можно ли пропустить кэширование по каким-либо внешним условиям, например. значение поля bean.Spring ehCache пропускает кеширование в соответствии со значением bean-компонента

У меня есть следующий метод кэширования:

@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator") 
public List<CloudEntity> getTestMetaRecords(final String someParam) { 
    ... 
    return aRetrievedList; 
} 

То, что я хочу, чтобы пропустить значение кэширования, не связанное с методом кэширования. Я знаю, что есть параметр unless внутри аннотации @Cacheable, но мне не удалось заставить его работать. Я добавил следующее:

unless = "#myBean.getSomeValue().equals(${value.from.properties})" 

Любая помощь очень ценится!

Update:

Хорошо, я обнаружил, что unless и condition параметры могут быть использованы как для условного кэширования, но они используют ограниченный набор метаданных в Spel: methodName, method, target ... И я был в состоянии сделать это только путем обращения к полю вызываемого объекта с помощью выражения root.target.

Мой код результата заключается в следующем:

@Cacheable(value = "MY_CACHE", keyGenerator = "myKeyGenerator", condition = "#root.target.myBean.getSomeValue().equals(#root.target.valueFromProperties)") 

Что мне не нравится в этом решении является то, что целевой класс с помощью метода кэширования должны быть изменены, чтобы включить мою зависимость myBean.

Есть ли более гибкое решение для этого?

+0

Можно ли оценить JSON, который возвращает в виде строки объекта, не используя, если? У меня есть следующее значение в JSON, {"status": "FAILED", "errorcode": "0001", "error": "..."}. Я хочу проверить как «if =» # result.status == FAILED ». Можно ли оценить это выражение? – nijogeorgep

ответ

0

У меня была более-менее та же проблема.

В самом деле, в контексте выражения SPEL для condition или unless реквизита @Cachable аннотацию не позволяет извлекать боба из ApplicationContext.

Однако я смог использовать оператор T() для извлечения контекста приложения через статический метод, а затем с этим я мог бы получить свой bean-компонент и вызвать метод, который мне нужен для этого условия.

Так что в моем случае, окончательное выражение SPEL было это:

condition="T(my.utils.package.Registry).getApplicationContext().getBean('myBean').cachingCondition()" 
Смежные вопросы