使用Injected bean方法返回值作为@Cacheable注释中的键

时间:2012-08-03 19:03:50

标签: java spring spring-security

我的一个bean中有一个@Cacheable注释方法,我想使用当前登录的用户ID作为Cache的密钥。但是,我正在使用Spring Security并在此bean中使用Injected服务作为实例变量,该变量调用SecurityContextHolder.getContext()。getAuthentication()以返回用户ID。因此,我在@Cacheable方法上有一个零参数构造函数。无论如何使用从我注入的服务方法返回的用户ID作为缓存的密钥?

@Service
public class MyServiceImpl implements MyService {

@Inject
private UserContextService userContextService;

@Override
@Cacheable("myCache")
public String getInformation() {
  //use this as the key for the cache entry
String userId = userContextService.getCurrentUser();
return "something";
}
}

UserContextService实现:

@Service
public class UserContextServiceImpl implements UserContextService {

public String getCurrentUser() {
return SecurityContextHolder.getContext().getAuthentication().getName();
}

}

我发现了这个问题,但它与我想做的有些不同。我不认为使用静态方法可以实现此功能。

Using Spring beans as a key with @Cacheable annotation

1 个答案:

答案 0 :(得分:1)

我会写这个类,以便userId是getInformation()方法的参数,并让方法/服务的用户自己查找ID。

@Override
@Cacheable("myCache")
public String getInformation(String userId) { ... }

IMO编写服务层以直接使用Spring Security上下文是一种不好的做法,因为它限制了服务的有用性 - 如果您实现某种不使用Spring Security的REST API(就像例如),那么getCurrentUser()可能没有意义/返回值。如果Spring Security未用于该请求,那么MyServiceImpl将无法使用,如果您需要支持“管理员用户需要查找用户X的信息”等内容,则此方法无法使用。

让面向Web的层担心如何从安全上下文中提取用户ID,而不是服务层。