Spring Boot Webアプリケーションがあります。 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
@RequestMapping
が設定されていても、ライトコントローラーが応答しないようです。なぜでしょうか?
PS。 Mavenのライフサイクル
test
を実行すると発生します。 IntelliJでdegubモードで実行している場合、エラーは出力されません。
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=
各プロパティに値を必ず追加してください。
MySQL JDBCドライバーを忘れたのかもしれません。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.34</version>
</dependency>
Spring JPA、Hibernate、Mysql、またはjacksonのようなpom.xmlの依存関係の一部が原因であることがわかりました。したがって、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
注釈を使用します。また、クラスパス全体をスキャンしてパフォーマンスに深刻な影響を与えるため、最上位のパッケージを指定するのは賢明ではありません。
この問題は、テストの実行中に発生します。依存関係を追加
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
これにより、データソースがセットアップされます。
コード行の下に変更する
spring.datasource.driverClassName
に
spring.datasource.driver-class-name
Spring Bootアプリでapplication.propertiesを使用している場合は、application.propertiesに次の行を追加するだけで機能します:
spring.datasource.url:jdbc:mysql:// google /?cloudSqlInstance =&socketFactory = com.google.cloud.sql.mysql.SocketFactory&user = ****&password = ****
Build.gradleのruntime groupにデータベース依存関係があることを確認します
runtime group: 'com.h2database', name: 'h2', version: '1.4.194'
または、Mavenを使用している場合、スコープをtestからruntimeに変更します
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.194</version>
<scope>runtime</scope>
</dependency>
Application.propertiesで必要なすべてのデータソースプロパティを指定した後でも、この問題に直面していました。その後、SpringブートのApplication.Javaとは異なるパッケージ階層にあり、プロパティがデータソースオブジェクトに適用されないため、プロパティ構成クラスがSpringブートによってスキャンされないことに気付きました。プロパティ設定クラスのパッケージ名を変更すると、機能し始めました。
私の場合、これはorg.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSourceが修飾子なしの自動配線フィールドであり、修飾名を持つ複数のデータソースを使用しているために発生していました。私のdataSource Bean構成の1つで@Primaryを任意に使用して、この問題を解決しました。
@Primary
@Bean(name="oneOfManyDataSources")
public DataSource dataSource() { ... }
AbstractRoutingDataSourceを実装し、修飾子が不要なため自動構成が機能することを望んでいると思います。必要に応じてBeanが適切なDataSourceに解決できる単一のデータソースがあれば十分です。そうすれば、単一のDataSourceしか持たないため、@ Primaryまたは@Qualifierアノテーションはまったく必要ありません。
いずれにせよ、私のBeanは修飾子でDataSourceを指定するため、私のソリューションは機能しました。また、単一のプライマリDataSourceがあるため、JPAの自動構成機能は満足です。これを「正しい」方法として推奨することは決してありませんが、私の場合、問題を迅速に解決し、目立った方法でアプリケーションの動作を阻止しませんでした。いつか、AbstractRoutingDataSourceを実装し、特定のDataSourceを必要とするすべてのBeanをリファクタリングして、おそらくそれがすてきなソリューションになることを願っています。
元の質問とは直接関係ありませんが、これは誰かに役立つでしょう。このエラーは、単純な2つのプロジェクト構造で発生しました。 1つのプロジェクトは、Spring jdbcを使用していくつかのデータベース操作を処理し(Aを使用)、もう1つのプロジェクトはjdbc操作をまったく使用しませんでした(Bを使用)。しかし、サービスBを開始しているときにこのエラーが発生しました。データソースを適切に初期化する必要があると言います。
私が理解したように、私は2つのモジュールの親pomにこの依存関係を追加しました
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
これにより、プロジェクトBのjdbc依存関係も初期化されました。だから、私はそれをAのpomに移しました、すべてがうまくいきました。
これが誰かを助けることを願っています
私の場合、application.propertiesファイル内の次のものを無視しました。
#休止状態
#spring.jpa.hibernate.ddl-auto = update
わたしにはできる....
アプリケーションをjarとして実行していますか? (Java -jar xxxx.jar)
その場合、そのjarにapplication.propertiesが保存されていますか?
いいえの場合、その理由を理解してみてください:
親のSpring Boot Dependencyを変更することで問題を解決しました。
<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リリースノート
あなたは試してみることができます:TomcatのVMオプションにこれを追加してください
-DdevBaseDir="C:\Your_Project_Dir_Path"
私は数日間同じ問題に直面していましたが、最終的に問題はコードではなく、問題はmavenから来ます、あなたは彼があなたのハードドライブ「C:\ Users\username.m2 \」からダウンロードしたすべてのファイルを削除する必要がありますリポジトリ」、プロジェクトの別の更新Mavenを実行すると、問題が修正されます。
この種のエラーが発生した場合、テストケースでBeanデータソースを作成できません。
いくつかの理由が原因である可能性があります。
exclude={datasource··}
などの方法を選択できます。AutoConfigureTestDatabase
が原因でした。あいまいさを引き起こす可能性のあるデータソースを選択します。解決策:@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
を追加して、デフォルトのデータソースを置き換えないようにします。