当前位置: 首页 > 知识库问答 >
问题:

在@cacheable注释中使用注入的bean方法返回值作为键

商燕七
2023-03-14
@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";
}
}
@Service
public class UserContextServiceImpl implements UserContextService {

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

}

使用Spring bean作为带有@cacheable注释的键

共有1个答案

鱼恩
2023-03-14

我将编写这个类,使userId成为getInformation()方法的参数,并使方法/服务传递的用户自己查找ID。

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

IMO将服务层编写为直接使用Spring Security上下文是一种糟糕的做法,因为它限制了服务的实用性--如果您实现了某种不使用Spring Security的REST API(仅作为示例),那么getCurrentUser()可能没有任何意义/返回值。如果该请求不使用Spring Security,则MyServiceImpl是不可用的,如果您需要支持“Admin user需要查找用户X的信息”之类的内容,则此方法也是不可用的。

让面向Web的层来操心如何从安全上下文中提取userid,而不是您的服务层。

 类似资料:
  • 代码如下所示。 但是,上面的代码不起作用:它给出了以下异常:

  • 问题内容: 有人可以给MWE 直接在方法上使用注释的方法吗? 我已经看到了无数的关于在类定义中使用它的示例-但还没有方法的示例。 引用文档: 这种添加到一个类定义或 一个方法 @Target(value = {TYPE, METHOD }) 因此,我认为还有一种可能性和预期的用途-但不幸的是,我无法弄清楚。 问题答案: 这里的DataSource类具有属性url,用户名,密码,driverClas

  • 我正在从下面的方法中获取电影列表,并带有@Cacheable注释。由于它没有任何参数,我将key设置为#root.method.name。 现在,我想添加一个新的电影,同样应该添加到上述缓存。 我试过这个,但它给了我例外。 我们可以在这里使用@CachePut注释,还是有其他方法?

  • 问题内容: 我的测试课: 我在行上得到一个空指针异常: 在精确的给出空指针异常 如何使Junit类中的beanObject字段自动装配成为可能,以便可以使用“ BeanClass”类中的方法? 从评论中复制: 用简单的术语来说.. beanClass是具有某些方法的接口..我用 注释标记了该beanClass。.banClass 是由具有方法实现的beanClassImpl类实现的。.我需要在我的

  • 我有一个基于XML配置的spring应用程序,其中一个bean需要com.typesafe.config.config参数作为构造函数参数。为此,我们有一个@Configuration类,其中一个方法(注释为@bean)返回一个com.typeSafe.config.config对象。 但spring启动时会抱怨“未能实例化[com.typesafe.config.config]:指定的类是接口”

  • 我试图向自定义注释中注入一个值,但Spring似乎没有进行评估。