简体   繁体   English

如何使用mongodb应用程序在spring boot中修复UnsatisfiedDependencyException?

[英]How to fix UnsatisfiedDependencyException in spring boot with mongodb application?

I'm trying to change my spring boot application DB from H2 to MongoDB. 我正在尝试将我的Spring启动应用程序DB从H2更改为MongoDB。 I have updated the application.properties file and removed any "@Entity" and "@Column" and added "@Document" instead. 我更新了application.properties文件并删除了所有“@Entity”和“@Column”并添加了“@Document”。 The error I'm getting is: 我得到的错误是:

Description: 描述:

Parameter 0 of constructor in smartspace.dao.rdb.RdbActionDao required a bean named 'mongoTemplate' that could not be found. smartspace.dao.rdb.RdbActionDao中构造函数的参数0需要一个名为“mongoTemplate”的bean,该bean无法找到。

Action: 行动:

Consider defining a bean named 'mongoTemplate' in your configuration. 考虑在配置中定义名为“mongoTemplate”的bean。

The full Console log: 完整的控制台日志:

2019-05-13 12:48:55.477  INFO 15596 --- [           main] smartspace.Application                   : Starting Application on LAPTOP-E00E1JFN with PID 15596 (D:\git\2019b.giron.aptik.smartspace\bin started by Lael in D:\git\2019b.giron.aptik.smartspace)
2019-05-13 12:48:55.480  INFO 15596 --- [           main] smartspace.Application                   : The following profiles are active: production,default
2019-05-13 12:48:56.313  INFO 15596 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2019-05-13 12:48:56.316  INFO 15596 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-05-13 12:48:56.354  INFO 15596 --- [           main] .RepositoryConfigurationExtensionSupport : Spring Data JPA - Could not safely identify store assignment for repository candidate interface smartspace.dao.rdb.ActionCrud.
2019-05-13 12:48:56.356  INFO 15596 --- [           main] .RepositoryConfigurationExtensionSupport : Spring Data JPA - Could not safely identify store assignment for repository candidate interface smartspace.dao.rdb.ElementCrud.
2019-05-13 12:48:56.475  INFO 15596 --- [           main] .RepositoryConfigurationExtensionSupport : Spring Data JPA - Could not safely identify store assignment for repository candidate interface smartspace.dao.rdb.UserCrud.
2019-05-13 12:48:56.503  INFO 15596 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 180ms. Found 1 repository interfaces.
2019-05-13 12:48:56.517  INFO 15596 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2019-05-13 12:48:56.518  INFO 15596 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-05-13 12:48:56.533  INFO 15596 --- [           main] .RepositoryConfigurationExtensionSupport : Spring Data MongoDB - Could not safely identify store assignment for repository candidate interface smartspace.dao.rdb.GenericIdGeneratorCrud.
2019-05-13 12:48:56.542  INFO 15596 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 23ms. Found 3 repository interfaces.
2019-05-13 12:48:56.947  INFO 15596 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2019-05-13 12:48:56.952  INFO 15596 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'taskScheduler' has been explicitly defined. Therefore, a default ThreadPoolTaskScheduler will be created.
2019-05-13 12:48:56.956  INFO 15596 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2019-05-13 12:48:57.078  INFO 15596 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$14f03da7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-13 12:48:57.093  INFO 15596 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.hateoas.config.HateoasConfiguration' of type [org.springframework.hateoas.config.HateoasConfiguration$$EnhancerBySpringCGLIB$$94708ad9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-13 12:48:57.104  INFO 15596 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration$$EnhancerBySpringCGLIB$$7fe1f8d6] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-13 12:48:57.117  INFO 15596 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationDisposableAutoCreatedBeans' of type [org.springframework.integration.config.annotation.Disposables] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-13 12:48:57.721  INFO 15596 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8089 (http)
2019-05-13 12:48:57.746  INFO 15596 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-05-13 12:48:57.746  INFO 15596 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.16]
2019-05-13 12:48:57.757  INFO 15596 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\integrationcourse\jdk8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\WINDOWS\System32\OpenSSH\;C:\Users\Lael\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Python27\python.exe;;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%SYSTEMROOT%\System32\OpenSSH\;C:\Users\Lael\AppData\Local\Microsoft\WindowsApps;C:\Users\Lael\AppData\Roaming\npm;C:\Program Files\MongoDB\Server\4.0\bin;;C:\Program Files\JetBrains\WebStorm 2018.3.1\bin;;C:\Program Files\heroku\bin;.]
2019-05-13 12:48:57.855  INFO 15596 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-05-13 12:48:57.856  INFO 15596 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2335 ms
2019-05-13 12:48:58.157  INFO 15596 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-05-13 12:48:58.265  INFO 15596 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-05-13 12:48:58.332  INFO 15596 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2019-05-13 12:48:58.388  INFO 15596 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
2019-05-13 12:48:58.389  INFO 15596 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-05-13 12:48:58.506  INFO 15596 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-05-13 12:48:58.645  INFO 15596 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate: 

    drop table generic_id_generator if exists
Hibernate: 

    drop sequence if exists hibernate_sequence
Hibernate: create sequence hibernate_sequence start with 1 increment by 1
Hibernate: 

    create table generic_id_generator (
       id bigint not null,
        primary key (id)
    )
2019-05-13 12:48:59.321  INFO 15596 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@1d6713dd'
2019-05-13 12:48:59.323  INFO 15596 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-05-13 12:48:59.356  WARN 15596 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'rdbActionDao' defined in file [D:\git\2019b.giron.aptik.smartspace\bin\smartspace\dao\rdb\RdbActionDao.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'actionCrud': Cannot resolve reference to bean 'mongoTemplate' while setting bean property 'mongoOperations'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'mongoTemplate' available
2019-05-13 12:48:59.356  INFO 15596 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-05-13 12:48:59.356  INFO 15596 --- [           main] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'
Hibernate: 

    drop table generic_id_generator if exists
Hibernate: 

    drop sequence if exists hibernate_sequence
2019-05-13 12:48:59.363  INFO 15596 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2019-05-13 12:48:59.365  INFO 15596 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2019-05-13 12:48:59.368  INFO 15596 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-05-13 12:48:59.378  INFO 15596 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-05-13 12:48:59.422 ERROR 15596 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in smartspace.dao.rdb.RdbActionDao required a bean named 'mongoTemplate' that could not be found.


Action:

Consider defining a bean named 'mongoTemplate' in your configuration.

This is my smartspace.dao.rdb.RdbActionDao: 这是我的smartspace.dao.rdb.RdbActionDao:

package smartspace.dao.rdb;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import smartspace.dao.EnhancedActionDao;
import smartspace.data.ActionEntity;

@Repository
public class RdbActionDao implements EnhancedActionDao{
    private ActionCrud actionCrud;
    private GenericIdGeneratorCrud genericIdGeneratorCrud;
    @Value("${smartspace.name}")
    private String ourSmartspaceName;
    @Autowired  
    public RdbActionDao(
            ActionCrud actionCrud,
            GenericIdGeneratorCrud genericIdGeneratorCrud) {
        super();
        this.actionCrud = actionCrud;
        this.genericIdGeneratorCrud = genericIdGeneratorCrud;
    }

    @Override
    @Transactional
    public ActionEntity create(ActionEntity actionEntity) {
        // SQL: INSERT INTO ACTION (ID, NAME) VALUES (?,?);

        GenericIdGenerator nextId = 
            this.genericIdGeneratorCrud.save(new GenericIdGenerator());
        if(actionEntity.getActionSmartspace() == null) {
            actionEntity.setKey(Long.toString(nextId.getId()) +"#"+ ourSmartspaceName);
            this.genericIdGeneratorCrud.delete(nextId);
        }
        if (!this.actionCrud.existsById(actionEntity.getKey())) {
            ActionEntity rv = this.actionCrud.save(actionEntity);
            return rv;
        }else {
            throw new RuntimeException("Action already exists with key: " + actionEntity.getKey());
        }
    }


    @Override
    @Transactional(readOnly=true)
    public List<ActionEntity> readAll() {
        List<ActionEntity> rv = new ArrayList<>();
        // SQL: SELECT
        this.actionCrud.findAll()
            .forEach(rv::add);

        return rv;
    }

    @Override
    @Transactional
    public void deleteAll() {
        // SQL: DELETE
        this.actionCrud.deleteAll();
    }

    @Override
    @Transactional(readOnly=true)
    public List<ActionEntity> readAll(int size, int page) {
        return this.actionCrud
            .findAll(PageRequest.of(page, size))
            .getContent();
    }


    @Override
    @Transactional(readOnly=true)
    public List<ActionEntity> readActionWithElementIdContaining( 
            String elementId,
            int size, 
            int page) {

        return this.actionCrud
                .findAllByElementId(
                        elementId,
                        PageRequest.of(page, size));
    }

    @Override
    @Transactional(readOnly=true)
    public List<ActionEntity> readActionAvaiable(
            Date fromDate, 
            Date toDate, 
            int size, int page) {
        return this.actionCrud
                .findAllByCreationTimestampBetween(
                        fromDate, toDate,
                        PageRequest.of(page, size));
    }

    @Override
    public List<ActionEntity> readAll(String sortBy, int size, int page) {
        return this.actionCrud
            .findAll(PageRequest.of(
                    page, size, 
                    Direction.ASC, sortBy))
            .getContent();
    }

    @Override
    @Transactional(readOnly=true)
    public Optional<ActionEntity> readById(String actionKey) {
        return this.actionCrud.findById(actionKey);
    }
}

This is my EnhancedActionDao: 这是我的EnhancedActionDao:

package smartspace.dao;

import java.util.Date;
import java.util.List;
import java.util.Optional;

import smartspace.data.ActionEntity;

public interface EnhancedActionDao extends ActionDao{
    public List<ActionEntity> readAll(int size, int page);
    public List<ActionEntity> readAll(String sortBy, int size, int page);
    public List<ActionEntity> readActionWithElementIdContaining (String text, int size, int page);
    public List<ActionEntity> readActionAvaiable (
            Date fromDate, Date toDate,
            int size, int page);
    Optional<ActionEntity> readById(String actionKey);

}

This is my ActionDao: 这是我的ActionDao:

package smartspace.dao;

import smartspace.data.ActionEntity;

public interface ActionDao {

    public ActionEntity create(ActionEntity actionEntity);
    public java.util.List<ActionEntity> readAll();  
    public void deleteAll();
}

This is my Application.java: 这是我的Application.java:

package smartspace;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }
}

And this is my application.properties: 这是我的application.properties:

smartspace.name =2019B.giron.aptik.smartspace


name.for.user.generator=World


spring.profiles.active=production,default

spring.jpa.hibernate.ddl-auto=create-drop

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE


server.port = 8089


spring.data.mongodb.uri=mongodb://laelav:laelav1@integrationcourse-shard-00-00-7bsmm.mongodb.net:27017,integrationcourse-shard-00-01-7bsmm.mongodb.net:27017,integrationcourse-shard-00-02-7bsmm.mongodb.net:27017/test?ssl=true&replicaSet=integrationcourse-shard-0&authSource=admin&retryWrites=true
spring.data.mongodb.host=integrationcourse-shard-00-01-7bsmm.mongodb.net
spring.data.mongodb.repositories.enabled=true
spring.data.mongodb.port=27017
spring.data.mongodb.database=course
spring.data.mongodb.username=laelav
spring.data.mongodb.password=laelav1

Thanks for the help in advance! 我在这里先向您的帮助表示感谢!

EDIT:
After adding the MongoTemplate Bean I have a new error:

>Description:

>The dependencies of some of the beans in the application context form a cycle:

>???????
>|  rdbActionDao defined in file [D:\git\2019b.giron.aptik.smartspace\bin\smartspace\dao\rdb\RdbActionDao.class]
>?     ?
>|  actionCrud
>???????

I think there's dependencies issue with mongoTemplate. 我认为mongoTemplate存在依赖性问题。 Please add this code in your dao. 请在您的dao中添加此代码。

    @Bean public MongoTemplate mongoTemplate() throws Exception 
{ 
      return new MongoTemplate(mongo(), "database_name");
}

Think so this may help here mongo() is your mongo client. 想想这可能有助于mongo()是你的mongo客户端。

The problem was fixed by importing the right libraries and using ID annotation by spring.data.... and not from javax. 通过spring.data ....导入正确的库并使用ID注释而不是从javax中修复问题。 one. 一。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM