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

无法使用Spring@Cacheable和@EnableCaching

邬宜然
2023-03-14

我正在尝试替换旧的:

@Component
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {

    @QueryHints({@QueryHint(name = CACHEABLE, value = "true")})
    MyEntity findByName(String name);
}

由此:

@Component
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {

    @Cacheable(value = "entities")
    MyEntity findByName(String name);
}

因为我想使用高级缓存功能,比如不缓存空值等等。

为此,我遵循了Spring教程https://spring.io/guides/gs/caching/

如果我没有为我的应用程序添加注释。在java中,缓存根本不起作用。

但是如果我添加EnableCaching和CacheManager bean:

package my.application.config;

@EnableWebMvc
@ComponentScan(basePackages = {"my.application"})
@Configuration
@EnableCaching
public class Application extends WebMvcConfigurerAdapter {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("entities");
    }

// ...
}

我在启动时收到以下错误:

Java语言lang.IllegalStateException:未指定CacheResolver,也未找到CacheManager类型的bean。注册CacheManager bean或从配置中删除@EnableCaching注释

如果我用CacheResolver bean替换My CacheManager bean,我会得到同样的错误,如下所示:

@Bean
public CacheResolver cacheResolver() {
    return new SimpleCacheResolver(new ConcurrentMapCacheManager("entities"));
}

我错过什么了吗?

共有2个答案

呼延俊良
2023-03-14

就我而言,Spring Boot库很旧,无法轻松升级。所以我使用了EHCache 2版本,它在我的应用程序中工作。以下是一个我觉得很有用的项目:https://github.com/TechPrimers/spring-ehcache-example/blob/master/src/main/resources/ehcache.xml

顾英发
2023-03-14

@赫劳你说得对,我得给豆子起名!问题是还有另一个bean“cacheManager”,所以最后,我没有对应用程序进行注释,而是创建了一个配置:

@EnableCaching
@Configuration
public class CacheConf{
    @Bean(name = "springCM")
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("entities");
    }
}

在MyEntityRepository中:

    @Cacheable(value = "entities", cacheManager = "springCM")
    MyEntity findByName(String name);
 类似资料:
  • 我开发了一个使用注释方法。代码为: 现在,我想在一些事件之后驱逐这个缓存: 一些与manager相关的报表已更新(添加或删除)。 之后,应该驱逐与管理器相关的缓存,这样,应用程序将获得新的数据,而不是使用该缓存中的现有数据。我为此开发了以下方法: 我调用inside方法,该方法更新Manager与其报表的关系。然而,这一个工作断断续续,我不确定这是不是正确的方式驱逐缓存。此外,缓存使用作为key的

  • 它可能非常简单,但我想知道我是否可以在一个方法上调用@cacheable和@cacheevict,如下所示: 上面的代码是在每次调用方法时逐出empListCache,还是只在缓存已满时逐出? 多谢了。

  • 我有一个服务与下一个方法: 我从控制器中调用getTestWithId100方法,但它只获得新值。 部分ehcache.xml: 为什么它不工作?我尝试了不同的键,但没有成功。

  • 我有一个用并尝试使用注释。该方法还用注释。将忽略注释。是否可以在Mapstruct方法上使用?

  • 问题内容: 我在源代码下找到了以下文档 CachePut批注不会导致目标方法被跳过-而是总是导致该方法被调用并将其结果放入缓存中。 这是否意味着如果使用,updateCustomer方法将仅执行一次,结果将在缓存中更新。随后对updateCustomer的调用将不会执行updateCustomer,而只会更新缓存。 在的情况下,方法将在每次调用时执行,结果将在缓存中更新。 我的理解正确吗? 问题答

  • 问题内容: 我是spring批注的新手,我想创建一个示例示例,该示例显示在spring 3.1中使用 @Cacheable批注 是否有人指导创建此示例? 问题答案: 希望下面的链接可能会对你有所帮助...... 一个示例应用程序。 还可以查看Spring的缓存抽象文档和spring源博客文章。