2012-05-21 3 views
3

Я пытаюсь сделать выселение записи в кэше Spring-Spring (абстракция Spring 3.1).Spring 3.1 cache - как использовать возвращаемое значение в SpEL

мне нужно сослаться на возвращаемое значение метода в SPEL от «ключа» собственности в аннотации:

/* (How to refer to the 'T' returned value in the "KEY_ID"?) */ 
@Caching(evict = { @CacheEvict(value = CACHE_BY_ID, key = KEY_ID) }) 
public T delete(AppID appID, UserID userID) throws UserNotFoundException { 
    return inner.delete(appID, userID); 
} 

Есть ли способ сделать это?

+0

В http://www.infoq.com/presentations/Spring-Security-3 (в 1:04:00) Wiesner использует filterObject как дескриптор возвращаемого значения, но это, вероятно, только дескриптор Spring Security. Думаю, стоит сделать снимок. –

+1

Вы еще не можете увидеть [SPR-8871] (https://jira.springsource.org/browse/SPR-8871) и принять участие. –

ответ

2

Это не похоже, есть ли способ ссылаться на возвращаемый объект:

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html#cache-spel-context

Но зачем вам это нужно сделать? Вы можете обратиться к аргументам в значении «ключ» @CacheEvict, например:

@CacheEvict(value = CACHE_BY_ID, key = "#userID") 
public T delete(AppID appID, UserID userID) throws UserNotFoundException { 
... 
} 

Больше пример кода в ответ на ответ ниже о том, чтобы выселить из нескольких кэшей с использованием нескольких свойств объекта пользователя:

@Caching(evict = { 
    @CacheEvict(value = CACHE_BY_ID, key = "#user.userID"), 
    @CacheEvict(value = CACHE_BY_LOGIN_NAME, key = "#user.loginName") 
    // etc. 
}) 
public T delete(AppID appID, User user) throws UserNotFoundException { 
... 
} 
+0

Объект T-класса, возвращаемый «delete», представляет собой такой объект: class User { UserID userID; LoginName loginName; EmailAddress emailAddress; ... }. У меня есть более одного кеша - один по идентификатору пользователя, другой - loginName, другой - по адресу электронной почты. Когда я удаляю запись по идентификатору пользователя, я хотел бы также закончить запись в двух других кэшах ... и эти ключи содержатся в возвращаемом значении, поэтому было бы здорово, если бы я мог: @CacheEvict (key = "# returnValue.loginName" ...), @CacheEvict (key = "# returnValue.emailAddress" ...) –

+1

Это можно сделать, если вы передали в объекте User в качестве аргумента вместо UserID, как вы могли бы затем ссылайтесь на разные свойства пользователя в SpEL. Вам нужно будет объединить это с аннотацией \ @Caching, если вам нужно выполнить несколько настроенных по-разному конфигураций \ @ CacheEvict: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference /html/cache.html#cache-annotations-caching – sdouglass

+0

Я отредактировал свой ответ с еще одним примером кода, который может лучше соответствовать вашей ситуации на основе вашего комментария. – sdouglass