Ответ 1
Похоже, что исходная проблема связана с автоконфигурированием.
Если вам не нужен источник данных, просто удалите его из процесса автоматической конфигурации:
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
У меня есть Spring загрузочное веб-приложение. Он был ориентирован на подход RESTful. Вся конфигурация кажется на месте, но по какой-то причине MainController не справляется с запросом. Это приводит к ошибке 404. Как это исправить?
@Controller
public class MainController {
@Autowired
ParserService parserService;
@RequestMapping(value="/", method= RequestMethod.GET)
public @ResponseBody String displayStartPage(){
return "{hello}";
}
}
Применение
@Configuration
@ComponentScan(basePackages = "")
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer{
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
ParserController
@RestController
public class ParserController {
@Autowired
private ParserService parserService;
@Autowired
private RecordDao recordDao;
private static final Logger LOG = Logger.getLogger(ParserController.class);
@RequestMapping(value="/upload", method= RequestMethod.POST)
public @ResponseBody String fileUploadPage(
}
}
UPDATE
Похоже, что MySQL не может быть инициализирован Spring....
Caused by: 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.
UPDATE2
application.properties
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/logparser
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
# Hibernate
hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql: true
hibernate.hbm2ddl.auto: update
entitymanager.packagesToScan: /
UPDATE4
Кажется, что контроллеры Lite не отвечают, хотя @RequestMapping
установлены. Почему это может быть?
PS. Это происходит, когда я запускаю жизненный цикл Maven
test
. При работе в режиме дегустации в IntelliJ ошибка не выводится.
UPDATE5
Также я использую этот DAO, как описано в учебнике....
public interface RecordDao extends CrudRepository<Record, Long> {
}
http://blog.netgloo.com/2014/10/27/using-mysql-in-spring-boot-via-spring-data-jpa-and-hibernate/
UPDATE6
Я изменил свои свойства приложения. И пробовал каждую комбинацию, но он отказывается работать.; (
Выход Maven:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running IntegrationTest
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.365 sec <<< FAILURE! - in IntegrationTest
saveParsedRecordsToDatabase(IntegrationTest) Time elapsed: 2.01 sec <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:331)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:213)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:290)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:292)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:233)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:176)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: 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.
Похоже, что исходная проблема связана с автоконфигурированием.
Если вам не нужен источник данных, просто удалите его из процесса автоматической конфигурации:
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
Из взглядов вещей вы не передали достаточно данных в Spring Boot для настройки источника данных
Создать/В существующем application.properties
добавить следующие
spring.datasource.driverClassName=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
убедитесь, что вы добавили значение для каждого из свойств.
Возможно, вы забыли драйвер JDBC MySQL.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
Я получал ту же ошибку, выяснилось, что это связано с некоторыми недостатками, отсутствующими в моем pom.xml, как у Spring JPA, Hibernate, Mysql или, возможно, джексоном. Поэтому убедитесь, что в вашем pom.xml не найдены зависимости и проверьте их совместимость с версиями.
<!-- Jpa and hibernate -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.3.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
Свойства hibernate.*
бесполезны, они должны быть spring.jpa.*
свойствами. Не говоря уже о том, что вы пытаетесь переопределить те, которые уже установлены с помощью свойств spring.jpa.*
. (Для объяснения каждого свойства я настоятельно рекомендую прочитать справочное руководство Spring Boot .
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true
# Hibernate
spring.jpa.hibernate.ddl-auto=update
Также пакеты для сканирования автоматически определяются на основе базового пакета вашего класса Application
. Если вы хотите указать что-то еще, используйте аннотацию @EntityScan
. Также указание самого пакета toplevel не очень разумно, поскольку он сканирует весь путь класса, который будет сильно влиять на производительность.
изменить ниже строку кода
spring.datasource.driverClassName
к
spring.datasource.driver-class-name
Если вы используете application.properties в загрузочном приложении spring, просто поставьте приведенную ниже строку в application.properties и она должна работать:
spring.datasource.url: jdbc: mysql://google/? cloudSqlInstance = & socketFactory = com.google.cloud.sql.mysql.SocketFactory & user = **** & password = ** **
Эта проблема возникает, когда вы используете Test. Добавить зависимость
testCompile group: 'com.h2database', name: 'h2', version: '1.4.197'
Добавьте ресурсы папки в тестовый источник, добавьте файл bootstrap.yml и укажите контент.
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:h2:mem:TEST
driver-class-name: org.h2.Driver
username: username
password: password
hikari:
idle-timeout: 10000
это позволит настроить источник данных.
В моем случае это происходило, потому что org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource - это поле с автоопределением без квалификатора, и я использую несколько источников данных с квалифицированными именами. Я решил эту проблему, используя @Primary произвольно на одной из моих конфигураций dataSource bean, например,
@Primary
@Bean(name="oneOfManyDataSources")
public DataSource dataSource() { ... }
Я предполагаю, что они хотят, чтобы вы реализовали AbstractRoutingDataSource, а затем эта автоматическая конфигурация будет работать только потому, что не требуется определитель, у вас есть только один источник данных, который позволяет вашему beans разрешать соответствующий DataSource по мере необходимости. Тогда вам вообще не нужны аннотации @Primary или @Qualifier, потому что у вас просто один источник данных.
В любом случае мое решение работало, потому что мой beans задает DataSource по квалификатору, а файл автоматической настройки JPA радует, поскольку он имеет один первичный DataSource. Я никоим образом не рекомендую это как "правильный" способ сделать что-то, но в моем случае он быстро решил проблему и не сдерживал поведение моего приложения каким-либо заметным образом. Будем надеяться, что в один прекрасный день обойдется реализация AbstractRoutingDataSource и рефакторинг всех beans, которым нужен определенный DataSource, а затем, возможно, это будет более аккуратное решение.
Я столкнулся с этой проблемой даже после предоставления всех необходимых свойств источника данных в application.properties. Затем я понял, что класс конфигурации свойств не был отсканирован при загрузке Spring, потому что он был в другой иерархии пакетов по сравнению с моей загрузкой Spring Application.java и, следовательно, никаких свойств не было применено к объекту datasource. Я изменил имя пакета моего класса конфигурации свойств и начал работать.
Убедитесь, что у вас есть зависимость базы данных во время выполнения группы при build.gradle
runtime group: 'com.h2database', name: 'h2', version: '1.4.194'
или изменить область от теста до времени выполнения, если вы используете Maven
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.194</version>
<scope>runtime</scope>
</dependency>
Не имеет прямого отношения к исходному вопросу, но это будет полезно для кого-то. Эта ошибка возникла у меня с простой структурой проекта. Один проект обрабатывал некоторые операции с базой данных с помощью весны jdbc (скажем, A), а другой вообще не выполнял никаких операций jdbc (скажем, B). Но все же эта ошибка появилась во время запуска службы B. Говорить, что источник данных должен быть правильно инициализирован.
Как я понял, я добавил эту зависимость к родительскому pom из двух модулей
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Это вызвало весну для инициализации зависимостей jdbc для проекта B тоже. Итак, я переместил его, чтобы поэкспериментировать. Помню, все было в порядке.
Надеюсь, это поможет кому-то
Вы используете приложение как банку? (java -jar xxxx.jar)
Если это так, у вас есть application.properties, хранящиеся в этой банке?
Если нет, попробуйте выяснить, почему:
Это сработало для меня, вы можете попробовать: Добавьте это в параметры VM в Tomcat
-DdevBaseDir="C:\Your_Project_Dir_Path"
В моем случае я просто проигнорировал следующее в файле application.properties:
# Спящий режим
# Spring.jpa.hibernate.ddl-авто = обновление
Меня устраивает....
Дайте вам что-то другое, когда вы сталкиваетесь с такой ошибкой, не можете создать источник данных bean в тестовом примере.
Это может быть вызвано некоторыми причинами:
exclude={datasource··}
.AutoConfigureTestDatabase
, он выберет источник данных для вас, который может вызвать неоднозначность. Решение: добавьте @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
чтобы избежать замены источника данных по умолчанию.
Я столкнулся с одной и той же проблемой в течение нескольких дней, и, наконец, проблема не в коде, проблема связана с maven, вы должны удалить все файлы, которые он загрузил с вашего жесткого диска "C:\Users\username.m2\репозиторий "и выполните еще одно обновление maven для вашего проекта, которое поможет вам решить вашу проблему.
Я решил проблему с изменением родительской зависимости Spring Boot.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
в
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
Дополнительные сведения см. В примечаниях к выпуску: Spring Boot 2.1.0 Примечания к выпуску
Если ничего из вышеперечисленного не работает для вас, есть вероятность, что вы не используете Java 8 или он не был правильно установлен в вашей системе (проверьте его, набрав в терминале java --version
(для mac) или командная строка). Это было так для меня. Мне пришлось удалить Java и переустановить Java 8 (перейдите к правильному способу удаления Java на Mac, если вы являетесь пользователем Mac), и проблема была решена.