Java EE 7 検証環境をつくる REST Webサービス
Java EE 7 を検証するために、環境をつくろうとしている。
めざしているのは、Web アプリ(MVC) + REST Webサービス + EJB + JPA をEARにまとめる。というところ。
なるべく、Java EE 7 が使えるようになったということなので、標準のみの環境を構築してみたかったのだが、はやばやと断念して、WebアプリにはSpring MVCを使うことに。
次は、REST Webサービスを構築しよう。
として、大はまり。Java EE って、簡単になったんじゃ無かったのかよ~ とか、GlassFish はやっぱりもうやばいのかな~ とか呪いの言葉を吐きながら、1日くらい格闘したのだけど。。。
結論としては、かなり簡単。凄く便利になってて驚いた。
まず、どう動作させるかをまとめる。
そのあと、どう苦労したのか、せっかくなので頑張った軌跡として記録しておこうと思う。
1.REST Webサービスプロジェクトを作成
Spring Tool Suite に、Spring MVC を EARに含めた状態を作成した ので、そこに、REST Webサービスのプロジェクトを追加する。 Spring MVC の依存関係をかんたんに解決するために、Spring Tool Suite を利用しているだけなので、以下の手順は、Eclipse WTP でも同じ。
1.1 Dynamic Web プロジェクトを作成
新規のプロジェクト作成から、Dynamic Web Project を選択。
ウィザードで、EAR membership の Add project to an EATR にチェックを入れる。
ここで入れなくても、あとで、EAR プロジェクトから追加できる。
2. REST Web サービスクラスを作成
package info.typea.tallarico.rest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/hello") public class Hello { @GET @Produces(MediaType.TEXT_HTML) public String greet() { return "<html><h1>Hello REST World!</h1>"; } }
一番シンプルな形で動作確認。
ApplicationConfig クラスを作成
package info.typea.tallarico.rest; import javax.ws.rs.core.Application; @javax.ws.rs.ApplicationPath("resources") public class ApplicationConfig extends Application{ }
3.実行
http://localhost:8080/TallaricoRest/resources/hello
にアクセス
取得できた!
成功
以上!
わかってみれば、凄く簡単!何の設定もしていない。
↓ 以下蛇足。
4.はまった点
結局、ApplicationConfig クラスを作成することがわからずに1日はまってた。
4.1 Jeresy を明示的に設定してしまった
上記例では、ApplicationConfig に “resources” とアプリケーションパスを設定しているが、これに気づかなかったので、この手の設定は不要になったんじゃ無いのかなぁなどと思いながら、web.xml に明示的にJeresy の設定を試みる。
<servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> </servlet> <servlet-mapping> <servlet-name>Jersey Web Application</servlet-name> <url-pattern>/webapi/*</url-pattern> </servlet-mapping>
4.2 Unable to load class が発生して動かない
2014-04-05T01:19:10.652+0900|警告: Unable to load class info.typea.tallarico.rest.Hello, reason: java.lang.ClassNotFoundException: info.typea.tallarico.rest.Hello
こんなエラーが発生して、動かない。。。
4.3 原因の調査
- GLASSFISH-16937 Having REST services in separate WARs in a single EAR prints classloading warnings
- GLASSFISH-16249 EAR deployment with multiple embedded WARs broken in 3.1
- GLASSFISH-20720 EAR deployment with multiple embedded WARs broken in 3.1.2.2 and 4.0
あたりのバグレポートがみつかる。
REST サービスや、EAR に複数のWARが含まれる状況で、同様のエラーが起きている。まさに、今の自分の状況じゃないか!4.0_b74 や、4.0.1 でFix となっている。
4.4 GlassFish の置き換え
- http://dlc.sun.com.edgesuite.net/glassfish/4.0/promoted/
- http://dlc.sun.com.edgesuite.net/glassfish/4.0.1/nightly/
上記あたりから、GlassFish をダウンロードして、入れ替えて試す。
最初、4.0 系で現在最新版(glassfish-4.0-b89-ml.zip)をダウンロード、インストールして試すも、症状が改善しなかったが、そもそも、最初から b89 だったりと迷走。結局、4.0.1 の最新版(glassfish-4.0.1-b04-12_31_2013-ml.zip ) でも解決せず。
こんな風にめんどくさいから、Java が敬遠されるんだよ!などとちょっとやけ気味になってくる。
4.5 単独のプロジェクトでも再現
上記のバグレポートでは、EARに二つ以上のWARが含まれる場合に発生となっているので、単独で先ずは構成してみようと試みる。
結果、単独のWARでも再現。途方に暮れる。
4.6 試行錯誤
Spring Tool Suite の手順通りに構築してみよう。
と、Spring Tool Suite の Getting Start プロジェクトから REST サービスのプロジェクトを構成してみる。
http://spring.io/guides/gs/rest-service/
が、途中で、完全に方向性を見失っている(このままでは、RESTサービスまでSpring依存になってしまう)ことに気づき、とりやめ。
4.7 解決へ
ここまでくると、何とかしたい。NetBeans IDE の存在が頭をよぎる。やつなら、簡単にそれくらいのことをやってくれるかも。ということで、ダウンロードしてインストール。
chmod +x ダウンロードしたファイル で 実行権限を付与した上で実行。
ウィザードに従いインストール
新規プロジェクトで、REST:HelloWorld プロジェクトを作成して、起動してみる
なんと、いとも簡単に起動するじゃないか。NetBeans人気があるのもわかる。
で、このプロジェクトの構成を確認して、ApplicationConfig が足りなかったことに思い至り、Spring Tool Suite で動作させるに至る。
5.結論というか雑感
NetBeans 頼りになる!困ったときには、NetBeans でサンプルつくると、確実に動く
サンプルができるので、構造解析するのに最適!
ただ、どうしてもエディタのフォントがシャギーなのがダメなんだよなー
というのと、Eclipse のショートカットキーが手になじんでいるので、Eclipseから離れられない。
しかしなーJava のこの組合せ爆発的な状態がやっぱり敬遠さえる原因になってるんだろうなぁとは思う。
最終的には凄く簡単にできたのでよかったのだが、ここまでたどり着くのに苦労するものなのか。
まぁ自分の拙さもあるのだろうが、これでは初学者にWelcome!というわけにはいかないだろうなぁ。
EJBとか、JPAをこれから試して見ようと思うが、先が思いやられる。。。
NetBeans頼みだなこりゃ。
NetBeansを使って、Java を一から覚えるのには、最適な一冊。