스프링 캐시에서 @Cacheable 주석의 늘 값을 캐시하지 않도록 하려면 어떻게 해야 합니까?
메서드가 null 값을 반환할 경우 이러한 메서드의 경우 결과를 @Cacheable annotation에 캐시하지 않도록 지정할 수 있는 방법이 있습니까?
@Cacheable(value="defaultCache", key="#pk")
public Person findPerson(int pk) {
return getSession.getPerson(pk);
}
업데이트: 작년 11월에 제출된 null 값 캐싱에 관한 JIRA 문제이며, 아직 해결되지 않았습니다.[#SPR-8871] @Cable 조건에서는 반환값을 참조할 수 있습니다 - Spring Projects Issue Tracker
만세, 스프링 3.2 현재 프레임워크는 스프링 SPEL을 사용하여 이를 허용합니다.unless
캐시블을 둘러싼 자바 문서의 메모:
다음 경우를 제외하고 public abstract 문자열
메서드 캐싱을 거부하기 위해 사용되는 Spring Expression Language(SpEL) 속성.
condition()과 달리 이 식은 메서드가 호출된 후에 평가되므로 결과를 참조할 수 있습니다.기본값은 " 입니다. 이는 캐싱이 거부되지 않음을 의미합니다.
중요한 건unless
는 메서드가 호출된 후에 평가됩니다.키가 이미 캐시에 있는 경우 메서드는 실행되지 않으므로 이 방법은 매우 적합합니다.
따라서 위의 예에서는 다음과 같이 주석을 달기만 하면 됩니다(#result는 메서드의 반환값을 테스트하는 데 사용할 수 있습니다).
@Cacheable(value="defaultCache", key="#pk", unless="#result == null")
public Person findPerson(int pk) {
return getSession.getPerson(pk);
}
이 상태는 늘 캐시를 허용하는 Ehcache와 같은 플러그형 캐시 구현을 사용할 때 발생할 수 있습니다.사용 사례 시나리오에 따라 바람직한 경우와 바람직하지 않은 경우가 있습니다.
이 답변은 현재 갱신되지 않았습니다.Spring 3.2 이후의 경우 Tech Trip의 답변 OP: 자유롭게 수락으로 표시하십시오.
불가능할 것 같습니다(스프링에 조건부 캐시 제거가 있는데도)@CacheEvict
앞의 파라미터호출이 false로 설정되었습니다(기본값).CacheAspectSupport
class는 반환된 값이 이전 어디에도 저장되지 않았음을 나타냅니다.inspectAfterCacheEvicts(ops.get(EVICT));
불러.
protected Object execute(Invoker invoker, Object target, Method method, Object[] args) {
// check whether aspect is enabled
// to cope with cases where the AJ is pulled in automatically
if (!this.initialized) {
return invoker.invoke();
}
// get backing class
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(target);
if (targetClass == null && target != null) {
targetClass = target.getClass();
}
final Collection<CacheOperation> cacheOp = getCacheOperationSource().getCacheOperations(method, targetClass);
// analyze caching information
if (!CollectionUtils.isEmpty(cacheOp)) {
Map<String, Collection<CacheOperationContext>> ops = createOperationContext(cacheOp, method, args, target, targetClass);
// start with evictions
inspectBeforeCacheEvicts(ops.get(EVICT));
// follow up with cacheable
CacheStatus status = inspectCacheables(ops.get(CACHEABLE));
Object retVal = null;
Map<CacheOperationContext, Object> updates = inspectCacheUpdates(ops.get(UPDATE));
if (status != null) {
if (status.updateRequired) {
updates.putAll(status.cUpdates);
}
// return cached object
else {
return status.retVal;
}
}
retVal = invoker.invoke();
inspectAfterCacheEvicts(ops.get(EVICT));
if (!updates.isEmpty()) {
update(updates, retVal);
}
return retVal;
}
return invoker.invoke();
}
스프링 주석인 경우
@Cacheable(value="defaultCache", key="#pk",unless="#result!=null")
동작하지 않습니다.다음으로 시도해 주세요.
@CachePut(value="defaultCache", key="#pk",unless="#result==null")
저는 좋아요.
언급URL : https://stackoverflow.com/questions/12113725/how-do-i-tell-spring-cache-not-to-cache-null-value-in-cacheable-annotation
'programing' 카테고리의 다른 글
AngularJS $watch 창 크기 조정 지시문 내부 (0) | 2023.03.16 |
---|---|
창 크기를 조정할 때 슬릭 슬라이더가 반응하지 않음 (0) | 2023.03.16 |
Webpack, Wordpress 및 BrowserSync가 함께 작동하도록 하는 방법 (0) | 2023.03.16 |
TypeError를 송신하는 JSON?json.dumps()의 바이트 부호화 방법 (0) | 2023.03.16 |
반환된 JSON 개체 속성을 (작은 첫 번째) camel Case로 변환합니다. (0) | 2023.03.16 |