以前Eclipseが不安定な方へという記事で探していた、JavaVMのオプション一覧を見つけたのでメモ。
Oracleの Java HotSpot VM Options というページにありました。
意外と多いですね。
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| « 5月 | ||||||
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | |||
以前Eclipseが不安定な方へという記事で探していた、JavaVMのオプション一覧を見つけたのでメモ。
Oracleの Java HotSpot VM Options というページにありました。
意外と多いですね。
TomcatでJSFを使っていると、いつもある仕様に悩まされています。
それは、入力フィールドが空白の場合にバッキングビーンのフィールドの型がString型なら長さが0の文字列として入力され、Integer等の数値型なら0が設定されてしまうということです。
String型の場合はまだ分かるのですが、数値型の場合は入力されなかったのか0が入力されたのか区別がつかないんです。
今まではバッキングビーンのフィールドは全てString型で対応していたのですが気持ち悪いので解決方法を探してみました。
とある案件で、カレンダーでの入力とファイルアップロードの機能が必要になりました。
フレームワークは、Mojarra + SpringFramework + Hibernate ですが、せっかくJSF2を使っているので、既存のコンポーネントが使えないか探してみました。 (more…)
Mojarra(GlassFish)を使っていて、勝手にBeanValidationが動作するので停止させる方法を探していました。
JSF2 の Final Draft では、「javax.faces.validator.DISABLE_BEAN_VALIDATOR」を true にすればよいと書いてあったのですが、停止できませんでした。
そこでソースコードを辿ってみたところ、WebConfigurationクラス に定義がありました。どうやら BeanValidation を停止させるには「javax.faces.validator.DISABLE_DEFAULT_BEAN_VALIDATOR」を true にすればよさそうです。
・・・どちらが正しいのでしょうか。 僕の見ていた資料が古いんですかね?
FaceletsではJSFのタグ(ui:repeat等)とJSTLのタグ(c:if等)が使えます。
ですが、評価されるタイミングが違うので混在すると思った通りに動かないことがあります。
JSFのタグはレンダリングの際に評価され、JSTLのタグはコンパイルの際に評価されるようです。
たとえば、以下のような書き方をしても、c:if タグの条件は思った通りに評価されません。
<ui:repeat var="member" value="#{members}">
<c:if test="#{member.admin}"><span class="admin">ADMIN</span></c:if>
<c:if test="#{!member.admin}">MEMBER</c:if>
<br />
</ui:repeat>
ui:repeatの代わりにc:forEachを使うか、次のようにc:ifの代わりにui:fragmentを使えば同じタイミングで評価されます。
<ui:repeat var="member" value="#{members}">
<ui:fragment rendered="#{member.admin}"><span class="admin">ADMIN</span></ui:fragment>
<ui:fragment rendered="#{!member.admin}">MEMBER</ui:fragment>
<br />
</ui:repeat>
Hibernate Validator を Hibernate と組み合わせるとINSERTやUPDATEするときに自動的に動作しますが、アプリケーションレベルでバリデーションを行っているときは、この動作が只のオーバヘッドになってしまいかねません。
この自動バリデートを停止するには、hibernate.validator.autoregister_listeners を false にすればいいみたいです。
Hibernate Validator のリファレンスマニュアルによると『Such a need is very uncommon and not recommended.』らしいですが(^^;(2010年2月17日追記)
これは Hibernate Search を使うときの警告みたいですね。単体で使うときは非推奨じゃないみたいです。
参照:
Hibernate Validator: Chapter 2. Using the Validator framework
Hibernate Annotations: Chapter 4. Additional modules
HibernateEntityManagerを使ってJPA実装としてHibernateを使うときに、クエリキャッシュの有効/無効の切り替え方がわからなくて調べたのでメモ。
まず、 persistence.xml で hibernate.cache.use_query_cache を true に設定します。
次に、ソースコードで EntityManager から作った Query に対して、以下のように設定します。
query.setHint("org.hibernate.cacheable", true);
これで、その query に対してクエリキャッシュが有効になります。
ジェトロに感謝!
最近、Eclipse3.5(galileo)を使い始めたのですが、m2eclipseで次のようなエラーが発生していました。
PM EDT: Error on adding indexing context http://repo1.maven.org/maven2/; read past EOF
このエラーが原因で、pomエディタで補完が利かなくなってました。
このエラーの解決方法を見つけたのでメモしておきます。
ウィンドウ → ビューの表示 → その他 → Maven → Mavenインデックス
→ MavenインデックスビューのセントラルリポジトリのURL(http://repo1.maven.org/maven2/)を選択(ないときは追加)
→ インデックスの更新
でいけるようです。
ジャンに感謝!
ご無沙汰しております。今日は久しぶりにプログラマっぽいことを書いてみます。
SpringFrameworkやGuiceといったDIコンテナを触っていて、いつも思うことがあります。
それは、「DIのためのインタフェースって必要?」ってことです。
よく本には「インタフェースを定義しておくことで、テスト時にモックと入れ替えることができる」とありますが、
別にインタフェースを使わなくてもできるんじゃないの?って思ってます。
実クラスにすると、IDEでインタフェースにジャンプしてイラっとしたりしませんし(笑)
例えば、(Guiceのコードからアイデアを貰いましたが)FrogManというクラスがあるとします。
そのクラスはVehicle(乗り物)というフィールドを持ち、scramble(緊急発進)というメソッドを持つとします。
Vehicleクラスの中身が出来ていない段階で、FrogManクラスをテストしたいとします。
DIの本ではVehicleインタフェースとVehicleMockクラスを作ってテストし、
本番ではVehicleImplクラスで実行するって感じだと思います。
でも、とりあえず中身が空のVehicleクラスを作っておいて、
テスト用のVehicleMockクラスはVehicleクラスを継承したらダメなんでしょうか?
文字だけならイメージが湧かないかもしれませんので、Guiceを使ったコードを書いてみます。
まず、FrogManクラスを作ります。
注入されたVehicleクラスのscrambleメソッドを呼び出す、同名のメソッドを用意しておきました。
public class FrogMan {
@Inject
private Vehicle vehicle;
public void scramble() {
this.vehicle.scramble();
}
}
次に、Vehicleクラスを作ります。とりあえず製作中だとします。
public class Vehicle {
public void scramble() {
System.out.println("製作中・・・");
}
}
次のようにして実行してみます。
FrogManクラスやVehicleクラスは実クラスですので、bindしなくても大丈夫みたいです。
Injector injector = Guice.createInjector(
new AbstractModule() {
@Override
protected void configure() {
}
}
);
FrogMan instance = injector.getInstance(FrogMan.class);
instance.scramble();
実行すると、画面には次のように表示されます。
製作中・・・
ちゃんと注入されているようですね。次に、テスト用のVehicleMockクラスを作ります。
public class VehicleMock extends Vehicle {
@Override
public void scramble() {
System.out.println("モックです");
}
}
テストでは次のようにして実行します。
モックを使うので、VehicleクラスにVehicleMockクラスをbindしています。
Injector injector = Guice.createInjector(
new AbstractModule() {
@Override
protected void configure() {
bind(Vehicle.class).to(VehicleMock.class);
}
}
);
FrogMan instance = injector.getInstance(FrogMan.class);
instance.scramble();
テストを実行すると、画面には次のように表示されます。
モックです
ちゃんとモッククラスに入れ替わっているようですね。
この方法だと、テストではVehicleのscrambleメソッドの中身に関係なく実行することができるようになりますし、
インタフェースも作らなくてよくなります。
・・・これじゃダメなんですかね?
WebKit for SWT というライブラリを見つけました。
どうやらSWTからWebKitの機能が利用できるようです。まだ試していないのでどこまでできるかわかりませんが、デモを見る限りJavaScriptやFlashもバリバリ動くようですね。
Javaで作られたブラウザとか、Javaの知識だけでRIAを作るとかできるかもしれません。
将来役立ちそうなのでメモ。