代码之家  ›  专栏  ›  技术社区  ›  iAshay

设置bean属性“mongoOperations”时,无法解析对bean“mongoTemplate”的引用

  •  4
  • iAshay  · 技术社区  · 7 年前

    这个问题已经没有什么答案了。但它们都不适合我。

    我一辈子都搞不明白为什么会出现错误。

    以下是我尝试的方法:

    • 使用AbstractMongoConfiguration
    • 使用ApplicationContext手动注册MongoTemplatebean

    每当我在maven构建期间或在tomcat上部署时尝试运行测试时,都会出现以下错误

    以下是配置。

    package com.fordit.project.config;
    
    @Configuration
    @EnableMongoRepositories(basePackages = "com.company.project")
    @ComponentScan(basePackages = "com.company.project")
    public class ProjectConfiguration {
    
    @Value("${project.db.driver_class}")
    private String driverClassname;
    
    @Value("${project.db.connection_string}")
    private String connectionString;
    
    @Bean
    public DataSource dataSource() throws PropertyVetoException {
        Properties mysqlProperties = new Properties();
        mysqlProperties.setProperty("characterEncoding", "UTF-8");
        mysqlProperties.setProperty("useUnicode", "true");
    
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        cpds.setProperties(mysqlProperties);
        cpds.setDriverClass(driverClassname);
        cpds.setJdbcUrl(connectionString);
        cpds.setAcquireIncrement(2);
        return cpds;
    }
    
    @Bean
    public static PropertyPlaceholderConfigurer getPropertyPlaceholderConfigurer() throws IOException {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ResourceLoader resourceLoader = new PathMatchingResourcePatternResolver();
        ppc.setLocations(
                resourceLoader.getResource(System.getProperty("PROJECT_CONFIGURATION_FILE")));
        return ppc;
    }
    
    @Bean
    public static RoleHierarchy roleHierarchy() {
    
        String roleHierarchyStringRepresentation
                = Role.ROLE_ADMIN + " > " + Role.ROLE_FIRM + "\n"
                + Role.ROLE_FIRM + " = " + Role.ROLE_LAWYER+ "= "+Role.ROLE_USER;
    
        //logger.info("Registered Role Hierarchy: \n{}", roleHierarchyStringRepresentation);
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy(roleHierarchyStringRepresentation);
        return roleHierarchy;
    }
    }
    

    Mongo配置:

    @Configuration
    @ComponentScan(basePackages = "com.company.project")
    @Profile("container")
    public class MongoDBConfiguration extends AbstractMongoConfiguration {
    
    @Value("${project.mongodb.hostname}")
    private String host;
    
    @Value("${project.mongodb.port}")
    private Integer port;
    
    @Value("${project.mongodb.name}")
    private String db;
    
    @Value("${project.mongodb.username}")
    private String username;
    
    @Value("${project.mongodb.password}")
    private String password;
    
    @Value("${project.mongodb.authenticationDB}")
    private String authDB;
    
    @Bean
    public MongoTemplate mongoTemplate()
        throws UnknownHostException, java.net.UnknownHostException {
    return new MongoTemplate(
            new SimpleMongoDbFactory(
                        mongoClient(),
                        getDatabaseName()
                )
        );
    }
    
    @Override
    @Bean
    public MongoClient mongoClient()  {
        MongoClient mongoClient = null;
        try {
            mongoClient = new MongoClient(
                    new ServerAddress(host, port),
                    Collections.singletonList(
                            MongoCredential.createMongoCRCredential(
                                    username,
                                    authDB,
                                    password.toCharArray()
                            )
                    )
            );
        } catch (java.net.UnknownHostException ex) {
            Logger.getLogger(MongoDBConfiguration.class.getName()).log(Level.SEVERE, null, ex);
        }
        return mongoClient;
    }
    
    @Override
    protected String getDatabaseName() {
        return db;
    }
    

    }

    错误日志:

    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'forumDAL' defined in file [/home/ashay/projects/kuber/target/classes/com/fordit/kuber/forum/ForumDAL.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'forumRepository': Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'mongoTemplate' available
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:729)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1270)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:541)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:107)
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:243)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)
    ... 26 more
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Dylan    5 年前

    摆脱 Profile("container") 在里面 MongoDBConfiguration

    说明:因为 @Profile 这意味着该类将不会被Spring实例化,除非您使用该概要文件运行Spring。我猜你没有 spring.profiles.active 当您通过Tomcat或在集成测试期间运行应用程序时,将属性设置为“container”。

    如果你想离开 @Profile("container") 然后确保将概要文件设置为“container”。有多种方法可以做到这一点。一种简单快捷的方法是使用Java系统属性,例如。 -Dspring.profiles.active=container ,当您在Tomcat中执行集成测试或运行应用程序时。