Spring Boot 1.xから2.0に変更した時に問題が起きた箇所のメモ。
Spring Boot (1.3) + Cloud (Brixton) で、デモ用にECサイトのサンプルを作っていました。
https://github.com/cero-t/e-commerce-example
これをSpring Boot (2.0) + Cloud (Finchley) のマイルストーン版に置き換えてみたところ、問題が出るとは予想してたけど、思った以上に問題が起きたので、その解決策のメモ。
spring-boot-actuatorだけじゃだめ、spring-boot-starter-actuatorを使う。
actuatorを使いたいのでspring-boot-actuatorをdependenciesに入れていました。1.5.9まではこれでも良かったんですが、2.0からは構成が変わり、このままだと依存するbeanが見つからないというエラーになりました。きちんとspring-boot-starter-actuatorを入れましょう。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency>
↓
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
最初からstarter使ってるわ、という人には関係ない話です。
Spring Cloud Streamが動かないのでスナップショット版(か、M6以降)を使う
今日(2018年1月)時点でMavenリポジトリに公開されているSpring Cloudのバージョンは「Finchley.M5」なのですが、このバージョンではSpring Cloud Streamが動きません。どうも@EnableBindingアノテーションで指定したクラスのBeanが生成されないようで、当該のBeanが見つからないというエラーになります。
Spring Cloud Finchleyのスナップショット版を試してみたところ普通に動いたので、ちょっとしたバグのようです。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
↓
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
JAP(Hibernate)の@GeneratedValueのポリシーが変わった?
データアクセスにはSpring Data JPAを使っていたのですが、ここでも問題が起きました。起動時に次のようなスタックトレースが出て、起動できなくなってしまいます。
org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing sequence [hibernate_sequence] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateSequence(AbstractSchemaValidator.java:184) at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:100) at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:191) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) (略)
@Entityアノテーションをつけたクラスに@GeneratedValueアノテーションを付けて、DB側で発行した連番を使うようにしていたのですが、この部分で急にHibernateがエラーを出すようになったみたいです。
元々、Spring DataのCrudRepositoryを使いたいだけで、JPA(Hibernate)の機能は全く使っていなかったので、Spring Data JPAをやめて、Spring Data JDBCに乗り換えました。
参考)
https://qiita.com/sndr/items/88827f06a14fcff71249
Spring Data JDBCは、少し「気が利かない」印象ですね。たとえば、テーブル名やカラム名のキャメルケース⇔スネークケースの変換を自分で書かなきゃいけないとか、@Id アノテーションは org.springframework.data.annotation.Id を使わなきゃいけなくて javax.persistence.Id を使ってると動かないとか。ただそういう所さえ気をつければ、書いた通りに動く素直なフレームワークという印象です。今後も使うかどうかは分かりません。
もうちょっとやりたかったんだけど
ホントは @RequestMapping を @GetMapping に置き換えたり、WebClientってブロッキングでも使えるんだっけみたいなところをもうちょっと検証したかったんですけど、とにかく起動してテストを通すだけで年が明けてしまいました。無念。