読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JPAのCDI Entity Listenersを試してみた

久しぶりにJPAネタです。

Java EE 7のJPA 2.1からEntity ListenerでCDIが利用できるようになりました。

EclipseLinkの例だと@EJBで書かれてます。
EclipseLink/Release/2.5/JPA21 - Eclipsepedia

この例だと、うーんロガーをわざわざEJBでかぁ…(^^;という感じが個人的にしたので、前にきしださんが書いていたプロデューサー使う方法でやってみました。d.hatena.ne.jp

LoggerProducerはそのまんまお借りして

@Named
@Dependent
public class LoggerPoducer {

    @Produces
    public Logger getLogger(InjectionPoint ip){
        return Logger.getLogger(ip.getMember().getDeclaringClass().getName());
    }
}

EclipseLinkの例にあったLoggerEntityLisetenerの@EJBを@Injectへ

public class LoggerEntityListener {
   @Inject //ProducerでInjectされる
   private Logger logger;
    
   @PrePersist
   public void prePersist(Object object) {
       logger.info("prePersist");
   }
   
   @PostPersist
   public void postPersist(Object object){
       logger.info("postPersist");
   }
   
   @PreDestroy
   public void preDestroy(){
       logger.info("preDestroy");
   }
   
   @PostConstruct
   public void postConstruct(){
       logger.info("postConstruct");
   }
}

そして、対象のEntityクラスに@EntityListenersでLoggerEntityListenerを指定しました。

@Entity
@EntityListeners({LoggerEntityListener.class})

EclipseLinkは2.5.2、APサーバはGlassFish 4.1で試したのですが…なぜかloggerがnullで上手くインジェクトされませんでした。

色々調べていたら以下に辿り着き

github.com

上記に以下リンクがありますが、GF4.1の問題っぽい?現象としてはこれと全く同じでした。
[GLASSFISH-21195] CDI Injection in Entity Listener - NullPointerException - Java.net JIRA

さらに読むとEclipseLink2.5.2の問題じゃないかみたいな。
Bug 438105 – Logic bug in EntityListenerInjectionManagerImpl

で、最終的には、最新のPayaraにはEclipseLink2.6が入って、それで動くよとのこと。

ということで、初めてPayaraをダウンロードしました。中はホント完全にGlassFishなんですね(^^;
Pre-Release Builds

利用したのは「Payara-web 4.1.153 (Web Profile)」です。

そして実行すると…動きました!

f:id:kikutaro777:20150618225652j:plain

GlassFishをPayaraに変えるのは全く手間がなさそうです。普通に動くし、今回のようにPayaraのほうが対応が早いケースがあるのを知ると、ちょっと真面目にPayara追っていかないとなーと。

前から既に追っているはすぬまさんのブログで勉強していかねば!

www.coppermine.jp

既にめっちゃPayaraについて書かれている(*´Д`)さすがすぎる

はすぬまさんのブログで「Payara」のタグがついている記事の検索結果
Programming Studio - 検索結果

CDI Entity Listenersについての日本語参考情報は以下。

etc9.hatenablog.com

qiita.com

軽量でモダンなコンポーネントライブラリ ButterFaces

少し前にJSFのSpec LeadでもあるEd Burnsさんが以下つぶやいていました。

JSFって下火な面もあって(盛り上がったことないだろ、というツッコミは置いておいて…)、さらにリッチコンポーネントライブラリに関しては、PrimeFacesが一人勝ちという状態なので、新しいコンポーネントライブラリが出てたことにびっくりしました。

www.butterfaces.org

2014年くらいからあるっぽいです。

デザイン的にはTwitter Bootstrapをベースとして、jQueryやHTML5の利点を取り入れたライブラリのようです。

ということで、少し触ってみました。

PrimeFacesになさそうなコンポをいくつか使ってみました。

f:id:kikutaro777:20150603220244g:plain

ビューは次のような定義です。

<h:form>
    <b:text label="ラベルー" value="#{butterFacesBean.value}" placeholder="hoge" />
    <b:commandLink value="送信" styleClass="btn btn-primary" action="#{butterFacesBean.commandLinkBtnAction()}"/>
    <b:tags value="#{butterFacesBean.tagsValue}" />

    <b:modalPanel id="mdl" cancelButtonText="cancel">
        <b:text value="hoge" />
    </b:modalPanel>

    <span onclick="butter.modal.open('mdl')">dialog</span>

    <b:textArea value="#{butterFacesBean.textArea}" expandable="true" />
</h:form>

前々からPinterestの検索テキストみたいなの欲しかったんで、tagsコンポはいいなーと。
textAreaもexpandableみたいな属性があって面白いです。

依存性は1つでmavenのpom.xmlでは次の定義をするだけです。

<dependency>
    <groupId>de.larmic.butterfaces</groupId>
    <artifactId>components-mojarra</artifactId>
    <version>1.8.1</version>
</dependency>

サイトのほうみるとcomponentsというartifactId(下の定義)が先に紹介されてますが、これだけだとテキストやボタンといった基本コンポーネントが使えませんでした。

<dependency>
    <groupId>de.larmic.butterfaces</groupId>
    <artifactId>components</artifactId>
    <version>1.8.1</version>
</dependency>

よくみるとコンポーネント紹介のところに「only mojarra version」とあります。

f:id:kikutaro777:20150603214759j:plain

基本コンポが使えないので、components-mojarraバージョンを使うのが普通じゃないのかな…と。

あと、HTML5はパススルーじゃなくて、普通に属性として定義されていました。

Showcaseでは属性を変えて色々試せるので、何ができるか、PrimeFacesのShowcaseよりちょっと良いかも。

f:id:kikutaro777:20150603221616g:plain

あ、ちなみにタイトルはサイトの英語から持ってきていますので、軽量でモダンかどうかは実際もっと使ってみないとホントかわからんです。

ガッツリJava EEで作られたZEEF.COM

少し前にJava EE 8に関する情報が色々まとまっていて、ウォッチするのにいいなぁと思ったページがありました。

javaee8.zeef.com

それで「ZEEF」って単語を何となく覚えていたのですが昨日Twitterで

というのをみて「え!WildFlyで動いてるの!?」とびっくりしました。で、さらにびっくりしたのは、なんとこのサイト、フロントがJSFで作られているっていう。

トップ画面の上段にオートコンプリート付きのテキストボックスあるんですけど
f:id:kikutaro777:20150515225008j:plain

この辺はPrimeFaces使ってるっぽいです!
f:id:kikutaro777:20150515225038j:plain

昔、@aoetkさんが

aoe-tk.hatenablog.com

で色々紹介されていたように、オープンなサイトをJSFで、というのはあるにはあるのですが…(^^;

で、このzeef.comのアーキテクチャについてAdam Bienさんがブログでインタビュー回答みたいな形式で書かれていて非常に興味深いです。

A Java EE Startup: Filtering Information with zeef.com : Adam Bien's Weblog

Java SE 8、Java EE 7の組合せでアプリケーションサーバはWildFly 8.2。そしてアプリはWARじゃなくてEAR形式とのこと。そういえば自分、EARで固めたことないなぁ(^^;

先ほども書きましたが、フロントはJSFで、CDI管理BeanやBean Validationや一部JSFのバリデータを利用してるとのこと。

EJB(Stateless以外にEJBTimerなんかも使ってるようです)やJPA,JAX-RSも使って、ガチなJava EE構成っぽいです。セキュリティはJASPIC(Java Authentication Service Provider Interface for Containers)、ただしJASPIC自身はlow-levelなので、higher levelなのは作る手間もあったようで、それがモチベーションとなってJava EE 8 securityのExpert Groupに参加されてるそうです。って、書くとさらっとしてるけど、すごいなぁ(^^;;

で、JSF周辺ですが

OmniFacesやPrimeFaces、PrettyTimeなどを使っているそうです。

PrettyTimeって初めて知りました(^^;これPrettyFaces作ってるのと同じ所ですね。

www.ocpsoft.org

自分もOmniFaces使ってたり

kikutaro777.hatenablog.com

PrimeFacesもガッツリなので

kikutaro777.hatenablog.com

なんか日本では浮いてる感じなのかなぁ…(そもそもJSFとかね)みたいに結構ネガティブだったのですが、あながち間違った選択してないんじゃー、的な気持ちになって嬉しかったです(^^)

その他、Markdownの処理にはPegDown、HTMLのパーサにJSoup、RSS/AtomはROME、画像周辺はImage4JmgscalrBatik、他にもGoogle API client libraryやキャッシュやJPA以外のエンティティにInfinispanHibernate Searchも使っているようです。

Java技術てんこ盛り!使ったことないライブラリも多々あるので少しずつ触ってみたいなぁ。

パフォーマンスどうなの?って辺りには

Java EE is incredible fast. The website itself is now doing over 120k views a month and as mentioned above is running on a single server basically, which is not even that powerful.

とのことで

ですね。サーバのスペックまでは書かれてないですが、それほどパワフルではないとのこと。

で、JSFにも触れてます。

You occasionally hear that JSF is supposedly not suited for public web sites, since it would be slow and using a lot of memory. We found however that this is absolutely not the case.

これは自分がJSFやり始めた頃にもよく聞いて、「JSFは速度やメモリ的にオープンなサイトにはあんまり向かない」と教えられて育ったので結構衝撃的な一文でした(^^;

あわせてJSF関連のベンチマークも紹介されてたので、読みたいところです。

他にも色々細かい説明書かれているので、Java EEな方々には参考になるのではないでしょうか。英語で細かいニュアンスいまいちわからない所もありますが、めっちゃ面白かったです。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村
QLOOKアクセス解析