ContractS開発者ブログ

契約マネジメントシステム「ContractS CLM」の開発者ブログです。株式会社HolmesはContractS株式会社に社名変更しました。

SpringBootのアノテーションを使う際につまずいたポイント

Holmesの倉島です。サーバーサイドの実装をしている最中に度々存在する、@(アノテーション)とそれに関連するエラー に頭を悩ませています。今回はそんな一例を紹介しようと思います。

@RestController

とあるControllerクラスに@RestControllerをつけたところ、実行時にエラーになってしまった!

新たにパッケージ内にControllerクラスを作成し、@RestControllerをつけたところテスト実行時に「ApplicationContextが読めない!」という旨のエラーが出てしまった。

java.lang.IllegalStateException: Failed to load ApplicationContext


結論を述べると、どうも同じ名前のControllerクラスが別パッケージ内に存在しているのでエラーになっていたらしい。成程それならばどちらかのControllerクラスの名前を変更すれば解決できそうです!余談として、どうしてもControllerクラスの名前を変更したくない場合は@RestControllerと同時に@Bean(name="hoge”)を付けても解決できるようです。

// before
@RestController

// after
@Bean(name="hoge")
@RestController

("hoge"の部分がSpring内での管理名になる。ちなみに"hoge"の部分は他のControllerクラス名と被っては同じ轍を踏むことになるので注意)

@SpringBootApplication

Entityクラスを、今まで保存している場所とは別のパッケージに作成したが、何やらエラーになってしまった...。

こちらも実行時にエラーになってしまった。

Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat

私はどうしても別パッケージにEntityクラスを作成したいのです!
解決法を求め調べを進めていくと、@SpringBootApplicationが付いているクラスにEntityクラスを保存すべきパッケージが設定されているらしい。
私はJPAを使用しているので、@SpringBootApplicationが付いているクラスにはEntityManagerFactoryが作成されるクラス名が指定してありました。そのクラスに念願のパッケージ指定箇所がありました!あとは、setPackagesToScanでパッケージのパスを指定して、晴れてEntityクラスを別パッケージに保存することができました。(ちなみに、repositoryクラスの保存すべきパッケージも@SpringBootApplicationが付いているクラスで指定できる)

@NamedQuery

Entityクラスの先頭部に記述されていた。エラーは出ていないが一体どういう意図で使用されているのだろう?

Entityクラスに、@Entityや@Data(lombok)と同じように@NamedQueryが@NamedQuery(name = "hogeTable.findAll", query = "SELECT h FROM hogeTable h") このように指定されていた。

@Entity
@Data
@NamedQuery(name = "hogeTable.findAll", query = "SELECT h FROM hogeTable h")
public class hogeTable { 

どうも、nameに設定されている名前を指定することによりqueryに設定されているsql文を実行することができるらしい。 別途Repository(jpa)を作成していた場合は、上記の例だと hogeTbaleRepository.findAll を指定することにより、SELECT h FROM hogeTable h の結果を取得することができる。(Repositoryを作成しない場合の指定方法は、EntityManagerクラスのcreateNamedQueryを使用する。EntityManager.createNamedQuery("hogeTable.findAll")のように指定する)

おわりに(感想)

結論(感想)としては、@(アノテーション)は理解した上で使用するのであれば面倒なことを考えなくていいので便利!と感じる反面、一見すると意味がわかりづらく保守性が下がる可能性があるのでは?という面もありました。過ぎた力は身を滅ぼしますね。
なんとなく表面だけ理解した状態で、言葉足らずの説明でしたが、参考になれば幸いです。

Holmesはエンジニア・デザイナーを募集しています 興味がある方はぜひこちらからご連絡ください!

lab.holmescloud.com

lab.holmescloud.com