Конфигурация MongoDB в Spring Boot и Spring Data REST

Я хочу использовать MongoDB для mongoDB с spring-boot и JPA. Я могу работать со встроенной базой данных H2. Но я не уверен, что происходит с использованием mongo-db. При запуске приложения я получаю сообщение об отсутствии источника данных.

@EnableAutoConfiguration
@EnableJpaRepositories(basePackages = "com..........repo")
@EnableWebMvc
@Configuration
@ComponentScan
@Import({ SpringMongoConfig.class, RepositoryRestMvcConfiguration.class })
public class Bootstrap extends SpringBootServletInitializer {

   public static void main(String[] args) {
       SpringApplication.run(Bootstrap.class, args);
   }

   @Override
   protected SpringApplicationBuilder configure(
           SpringApplicationBuilder application) {
       return application.sources(Bootstrap.class);
   }
}

.

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

import com.mongodb.Mongo;
import com.mongodb.MongoClient;

@Configuration
@EnableMongoRepositories(basePackages = "com.............repo")
@PropertySource(value = "classpath:mongo-config.properties")
public class SpringMongoConfig extends AbstractMongoConfiguration {

@Value("${MONGO_DB_HOST}")
private String MONGO_DB_HOST;

@Value("${MONGO_DB_PORT}")
private int MONGO_DB_PORT;

@Value("${DB}")
private String DB;

@Override
protected String getDatabaseName() {
    return DB;
}

@Bean
@Override
public Mongo mongo() throws Exception {
    return new MongoClient(MONGO_DB_HOST, MONGO_DB_PORT);
}

}

.


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:293)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
     ..........................
     Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:509)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:290)
    ... 25 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:597)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:990)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
....................................
     Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource()] threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586)
    ... 39 common frames omitted
     Caused by: org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
    at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.getDriverClassName(DataSourceProperties.java:93)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration.dataSource(DataSourceAutoConfiguration.java:105)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


person Sarath    schedule 23.09.2014    source источник


Ответы (1)


Для начала используйте фреймворк Spring Boot выполнит автоконфигурацию для фреймворков, которые он обнаружит. Сюда входят Spring Data JPA и Spring Data Mongo. Таким образом, вы можете удалить аннотацию @Enable для него.

То же самое для Spring MVC и Spring Data Rest.

Чтобы разрешить Spring Boot настраивать Spring Mongo, добавьте следующие свойства в ваш application.properties

spring.data.mongodb.host= # the db host
spring.data.mongodb.port=27017 # the connection port (defaults to 27107)

или

spring.data.mongodb.uri=mongodb://localhost/test # connection URL

Подробнее о поддержке Spring Boot Mongo можно узнать в этот раздел Справочного руководства по Spring Boot.

Если встроенный источник данных не используется, вы должны указать, какой драйвер использовать для этого, добавьте следующее свойство в файл application.properties. Это также задокументировано в этот раздел Справочного руководства по Spring Boot.

spring.datasource.driverClassName=ваш.драйвер.класс

Я предлагаю переместить ваш класс Bootstrap в пакет верхнего уровня и удалить все ненужные аннотации и файлы конфигурации.

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Bootstrap extends SpringBootServletInitializer {

   public static void main(String[] args) {
       SpringApplication.run(Bootstrap.class, args);
   }

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       return application.sources(Bootstrap.class);
   }
}

Должно быть достаточно для загрузки всего вашего приложения, включая jpa, mongo и веб-поддержку.

Для получения достаточно полного списка я предлагаю Приложение A Справочного руководства по Spring Boot.

person M. Deinum    schedule 23.09.2014
comment
После внесения указанных вами изменений и добавления application.properties в путь к классам со следующими свойствами также возникает такое же исключение. spring.data.mongodb.uri=mongodb://localhost:27017/test spring.datasource.driverClassName=com.mongodb.Mongo - person Sarath; 23.09.2014
comment
Читать и еще раз читать. Источнику данных нужен драйвер JDBC, а НЕ MongoDB. - person M. Deinum; 23.09.2014
comment
<dependency> <groupId>net.sf.mongojdbcdriver</groupId> <artifactId>mongojdbcdriver</artifactId> <version>0.0.2</version> </dependency> Я добавил, а spring.datasource.driverClassName=net.sf.mongodb_jdbc_driver.MongoDbDriver Exception остался прежним. - person Sarath; 23.09.2014
comment
Что именно вы хотите сделать? Вы хотите использовать клиент Mongo или вы хотите использовать MongoDB в качестве клиента JDBC? Как я изначально понял, вопрос заключается в том, что вы хотите использовать Mongoclient, а также объекты JPA. Однако, похоже, это не так. (Также я сомневаюсь, что исключение остается прежним.) - person M. Deinum; 23.09.2014
comment
Хорошо, приложение выглядит так. Это веб-приложение, в котором я хотел использовать MongoDB для всех операций CRUD, которые представлены как REST API. Я экспериментировал с spring-boot, spring-data-rest и JPA. Дело в том, что он работает для встроенной базы данных h2. Но я не хочу использовать встроенную базу данных h2 для выполнения операций CRUD в mongodb. Я следовал инструкции, которую вы опубликовали. Исключение не изменилось. Не знаю, что мне не хватает. - person Sarath; 23.09.2014
comment
Если вы хотите использовать MongoDB, что там делает JPA, это та часть, которую я не понимаю. Итак, вы снова хотите использовать простой mongodb или хотите получить доступ к mongodb через JDBC? Из вашего сообщения неясно, похоже, вы хотите объединить Mongodb и jpa... - person M. Deinum; 23.09.2014
comment
Привет, ребята, есть новости по этому поводу? В моем случае настройка свойств монго в пути к классам не работает, мое приложение всегда подключается к тестовой базе данных, а не к предоставленной мной - person 89n3ur0n; 09.03.2015
comment
Вы настраиваете, чтобы удалить свою собственную конфигурацию MongoDB, удалить @EnableMOngoRepositories и @EnableJpaRepositories. Spring boot сделает все это за вас. То же самое касается @EnableWebMvc и импорта RepositoryRestMvcConfiguration, которые будут выполняться автоматически. - person M. Deinum; 10.03.2015
comment
У вас есть эта зависимость '‹dependency› ‹groupId›org.springframework.boot‹/groupId› ‹artifactId›spring-boot-starter-data-mongodb‹/artifactId› ‹/dependency›` - person yodamad; 29.10.2015
comment
Есть ли возможность дать автоматическое переподключение в spring.data.mongodb.uri? - person Satish Patro; 06.02.2019