Evaluate @Cacheable(condition) once per method invocation only

Issue: SPR-17024
This commit is contained in:
Juergen Hoeller
2018-07-16 13:04:14 +02:00
parent 93d91219fd
commit faef363e85
2 changed files with 66 additions and 9 deletions

View File

@@ -693,6 +693,9 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker
private final Collection<String> cacheNames;
@Nullable
private Boolean conditionPassing;
public CacheOperationContext(CacheOperationMetadata metadata, Object[] args, Object target) {
this.metadata = metadata;
this.args = extractArgs(metadata.method, args);
@@ -733,12 +736,17 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker
}
protected boolean isConditionPassing(@Nullable Object result) {
if (StringUtils.hasText(this.metadata.operation.getCondition())) {
EvaluationContext evaluationContext = createEvaluationContext(result);
return evaluator.condition(this.metadata.operation.getCondition(),
this.metadata.methodKey, evaluationContext);
if (this.conditionPassing == null) {
if (StringUtils.hasText(this.metadata.operation.getCondition())) {
EvaluationContext evaluationContext = createEvaluationContext(result);
this.conditionPassing = evaluator.condition(this.metadata.operation.getCondition(),
this.metadata.methodKey, evaluationContext);
}
else {
this.conditionPassing = true;
}
}
return true;
return this.conditionPassing;
}
protected boolean canPutToCache(@Nullable Object value) {