人生、気合いと具合 - blog

2015年04月

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にあげておきました。


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

このページのトップヘ