人生、気合いと具合 - blog

JSFのManagedBeanとCDIのNamedを調べていて、どうにも腑に落ちない現象に出会った。
ほとんど同じ構成のearなのに、ManagedBeanがちゃんと認識されるケースとされないケースがある。

動かないearは以下のような最低限の構成。なお、タイトルにもある通り、サーバはGlassFish4.1。

META-INF/MANIFEST.MF
lib/myapp.jar
myapp.war

@ManagedBean と @javax.faces.bean.ViewScopedを指定したクラスがjarに入っていて、warにそれを使うxhtmlが入っている。
で、これをデプロイすると動かない。
Beanのクラス名が"JsfHello"で、
javax.el.PropertyNotFoundException: Target Unreachable, identifier 'jsfHello' resolved to null
なので、認識されてないっぽい。

でも、本格的に調べ始める前に暫定で作ってたやつは、ほとんど同じ構成で動いた。構成はこう。

META-INF/MANIFEST.MF
lib/sssss.jar
myweb.war

名前が雑だけど、同じようにjarとwarにBeanとxhtmlが入っている。
こっちは最初、faces-config.xml とか beans.xml とか入れていたり、application.xml を入れたりしていたので、その辺の違いかなーと思って上記の状態まで削除したんだけどやっぱり動く。
さて、何が影響してるのか、と考えてもさっぱりわからない。

で、昨日から今日にかけてダメ元でいろいろ試した結果、得られた結論は「jarとwarの名前が一緒だとManagedBeanが認識されない」
そんな馬鹿な、とも思ったんだけど、最初の構成で、jarの名前だけ変えてデプロイするとちゃんと動く。
個人的には「え!?そんなんありか?」って感じなんだけど、これって仕様なの?バグ?

★2015/5/1追記
さらに試したところ、
myapp.jar + app.war -> NG
app.jar + myapp.war -> OK
myapp.jar + my.war -> NG
my.jar + myapp.war -> OK
となったので、どうも、「jar名がwar名を含むとダメ」に見える。ほんとか?

割と早く申し込みがいっぱいになってしまっていたので、酔った勢いで懇親会LT枠に登録。

当日はちょっと遅れた上にLT資料を作り続けていたので、本編のメモが全然取れませんでした。
ハイライトはJava Updateでしょうか。

で、何とかLTの資料は完成したのですが、開始前に確認したら、HDMIが繋がらないことが発覚。結局ノートPCを貸していただき、資料をコピーして発表しました。(いろいろドタバタしてしまいスタッフの方々すみません)
そのせいか、最後のデモで例外が出てしまい残念でしたが、手元のタブレットで見てもらったりしたのでよいでしょう。
30億のデバイスで走るのに発表のデモは失敗するJava。ありがち。

ちなみに今回も資料はScalaFXで作ってます。表示用にノートPCで動かして、操作をタブレットでできるようにしてみました。
操作に対応する処理の実行部分を切り替え可能にしてあって、タブレット側は画面のタッチ等のイベントを拾って、処理すると同時にWebSocketに処理の内容を送る。
ノートPC側はWebSocketのメッセージ受信を契機に処理を行う、という感じです。
WebSocket通信は、herokuでGlassFish4.1(Embedded)を動かして実現してます。
LTでは操作側と表示側、1対1で実行しましたが、理論上、表示側は複数接続可能にしてあります。せっかくだから会場で試してみればよかったかな。

一応、スクリーンショットを並べたものをslideshareにあげておきました。


スタッフの方々お疲れ様でした&会場提供していただいたビズリーチさんありがとうございました。
参加無料で懇親会にピザとビールも提供していただけるとは太っ腹。ビズリーチさん素晴らしい!

この記事は、しょぼちむ Advent Calendar 2014 の20日目の記事になるはずでした。

19日目は @setoazusa さんの しょぼちむにテストファーストについて説明してみる でした。
21日目は @seri_k さんの 若者と転職 です。 

 そんなわけで、残念ながら間に合わなかった記事でございます。なぜかって?SIerだからさ!

しょぼちむといえばやはり目の前で見た、某雪だるま氏へのくんかくんかが最も記憶に残っています。ってことで(?)、ScalaFXを使ったミニゲームです。 

画面に出てくる雪だるまをタッチするとロックオン、画面下でうろうろしているレッドキングにタッチするとくんかくんかします。(タッチパネルじゃない場合はマウスクリックでも動きます)
複数まとめてロックオンしてからくんかくんかすると高得点。約1分間でどれだけくんかくんかできるかを競います?(なんのこっちゃ)

ダウンロード:http://homepage2.nifty.com/bugworm/webapp/syobo/AdventCalendar2014.jar
 
Java 8 + Scala2.11 + ScalaFXを使用。動作はJava 8だけあればOKだと思います。

kunka




























このページのトップヘ