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

Config.class中的CacheManager bean定义导致NoSuchBeanDefinitionException

邵博远
2023-03-14

我有一个Spring服务正在检查数据库条目。为了最小化我的存储库调用,两个find方法都是“@cacheable”。但是,当我尝试初始化我的服务bean,而我的配置类有一个CacheManager bean定义时,我会得到以下NosuchBeanDefinitionException:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'foo.mediacode.directory.MediaCodeDirectoryService' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093)
at foo.mediacode.directory.MediaCodeDirectoryService.implementation(MediaCodeDirectoryService.java:63)
at foo.campaigntree.directory.CampaignTreeDirectoryService.<init>(CampaignTreeDirectoryService.java:18)
... 15 more

如果我取出CacheManager bean定义,我可以初始化我的服务bean,它运行时没有任何问题和缓存!

下面是我的代码:配置

...
    @Configuration
    @EnableCaching
    @EnableJpaRepositories(...)
    @PropertySource({...})
    public class MediaCodeDirectoryServiceConfig {

        private static Logger   configLogger    = Logger.getLogger(MediaCodeDirectoryServiceConfig.class.getName());

        @Value("${jpa.loggingLevel:FINE}")
        private String          loggingLevel;

        @Value("${mysql.databaseDriver}")
        private String          dataBaseDriver;

        @Value("${mysql.username}")
        private String          username;

        @Value("${mysql.password}")
        private String          password;

        @Value("${mysql.databaseUrl}")
        private String          databaseUrl;

        @Bean
        public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
            ...
        }

        @Bean
        public MediaCodeDirectoryService mediaCodeDirectoryService() {
            return new MediaCodeDirectoryService();
        }

        @Bean
        public CacheManager mediaCodeCacheManager() {
            SimpleCacheManager cacheManager = new SimpleCacheManager();
            cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("mediaCodeMappingRegexCache"),
                    new ConcurrentMapCache("mediaCodeMappingsCache")));

            return cacheManager;
        }

        @Bean
        public JpaTransactionManager transactionManager() {
            ...
        }

        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            ...
        }

        public DataSource getDataSource() {
            ...
        }

        public JpaDialect getJpaDialect() {
            ...
        }

        public Properties getEclipseLinkProperty() {
            ...
        }

        public JpaVendorAdapter getJpaVendorAdapter() {
            ...
        }
    }
....
    public class MediaCodeDirectoryService implements MediaCodeDirectoryServiceApi {

        ...

        @Autowired
        private MediaCodeDirectoryRepository repo;

        @SuppressWarnings("resource")
        public static MediaCodeDirectoryServiceApi implementation() {
        if (INSTANCE == null) {
                ApplicationContext ctx = new AnnotationConfigApplicationContext(MediaCodeDirectoryServiceConfig.class);
                INSTANCE = ctx.getBean(MediaCodeDirectoryService.class);
            }

            return INSTANCE;
        }
...
...
@Repository
public interface MediaCodeDirectoryRepository extends CrudRepository<MediaCodeDao, Integer> {

    @Cacheable("mediaCodeMappingRegexes")
    @Query("SELECT m FROM  #{#entityName} m WHERE (m.fooId = :fooId) AND (m.isRegex = :isRegex) ORDER BY (m.orderId DESC, m.id ASC)")
    List<MediaCodeDao> findByfooIdAndIsRegexOrderByOrderIdDescAndIdAsc(@Param("fooId") int fooId, @Param("isRegex") boolean isRegex);

    @Cacheable("mediaCodeMappings")
    List<MediaCodeDao> findByMediaCode(String MediaCode, Pageable pageable);
}
INSTANCE = (MediaCodeDirectoryService) ctx.getBean("mediaCodeDirecotryService")

这里有人知道这可能是什么原因吗?我的配置中是否遗漏了什么?THX!

共有1个答案

訾旭
2023-03-14

缓存是通过AOP应用的。对于AOP,Spring使用基于代理的方法,默认情况是创建基于接口的代理。

public class MediaCodeDirectoryService implements MediaCodeDirectoryServiceApi {... }

在运行时使用这个类定义,您将得到一个动态创建的类(proxy$51或类似的内容),它实现了所有接口,但不是MediaCodeDirectoryService。但是,它是MediaCodeDirectoryServiceAPI

您有两种方法来修复这个问题,要么编程到接口(无论如何您都应该这样做,因为您已经定义了接口)而不是具体的类,要么使用基于类的代理。

第一个选项涉及直接更改代码的位置@autowire或获取MediaCodeDirectoryService的实例,以使用MediaCodeDirectoryServiceAPI(您应该已经这样做了,否则为什么要定义接口)。现在您将得到代理注入,一切都将工作。

第二个选项涉及在@enablecaching注释上设置proxytargetclass=true。然后,您将得到一个基于类的代理,而不是基于接口的代理。

@EnableCaching(proxyTargetClass=true)
 类似资料:
  • 问题内容: 我有一个简单的函数,它仅将翻译后的消息从服务器返回到客户端。但是,当我将结果传递给var时,结果显示为未定义。 结果- >未定义(错误) 当我查看标题时,它会给我: 为什么我仍然得到不确定的结果? 问题答案: 您可以将回调函数传递给该函数 然后调用:

  • 我有以下文件: 当我试图用它构建一个共享对象时,如下所示: 输出行: 但为什么?难道只有当其中一个虚函数不是纯粹的或者没有定义时,才应该这样吗?我知道我可以通过使用进行编译来规避这个问题,但我正在尝试理解这种行为。

  • 我在ngClass中添加了一个条件和一个如下所示的类。这里没有问题。 但当我将条件中的类更改为如下所示时(注意不同之处,48更改为40) 未定义height-100p-40px css类。 该页面会冻结主线程并杀死浏览器。这可能是什么原因。我认为,丢失的css类应该不会造成任何错误?

  • 计算数组长度有一个众所周知的模式: 此模式适用于静态数组和恒定大小的自动数组。它也适用于C99中的可变长度数组。 我想应用类似的想法来计算动态数组的大小(以字节为单位): 这比 更好不是指实际的数组元素类型。因此,它不需要代码的读者知道类型。 然而,我不清楚表达式是否会导致未定义的行为。随着它的扩展: 如果为,则结果表达式有问题: 根据C99标准: (C99,6.3.2.3p3):“具有值 运算符

  • //为什么这个问题不是(如何在回调中访问正确的“this”?):我的问题是一个特定于反应的问题,访问者可能不会在精神上将上述链接中提出的问题与我正在努力解决的问题联系起来。 我正在尝试存储Firebase auth的onAuthStateChanged函数返回的用户数据,并将该数据存储在状态中,以便在我的react应用程序中使用它。在我的应用程序中,我有以下监听器: 但是我得到错误“TypeErr

  • Context.xml 堆栈跟踪: