日々精進

新しく学んだことを書き留めていきます

java

IntelliJでWASサーバをデバック実行しようとしたら、「Error:Unable to make the module: xxx, related gradle configuration was not found. Please, re-import the Gradle project and try again.」エラー

原因は、IntelliJがbuild.gradleのタスクを読み込んでないことだった。 Tool Windows > gradleからGradle task viewを表示し、Refreshしたら直った。 参考: stackoverflow.com

Servletを実行すると「servlet class was found, but a resource injection failure has occurred」エラー

Servletクラスのフィールドで@Injectアノテーションを使ってオブジェクトを詰めているところで エラーが発生した。 原因はCDIのバージョンがビルド時と実行環境で異なることが原因(たぶん) JavaEE7環境では動かなかったけど、JavaEE6環境で動かすと動いた…

wsimportから生成したJARを取り込むと、すべてのクラスがdefault packageに入っていて参照出来ない

以下のコマンドで生成したJARの中のクラスがdefault packageに入ってしまっていた。 wsimport -clientjar api.jar IF.wsdl macでJDK1.8に入っているwsimportを使った場合は大丈夫だったが、windowsでJDK1.7に入っているwsimportを使った場合、同じコマンドを…

Elipseでビルドする際のJVMのターゲットバージョンを変更する

Eclipse全体の設定は以下のように行う。 Eclipse メニューから「ウィンドウ」>「設定」を選択し、「設定」ダイアログを開きます。 「Java」>「コンパイラー」を選択し、表示された画面で「コンパイラー準拠レベル」を選択します。 但し、既に作成済みのプロ…

MacにインストールされたJDKを削除する

以下のコマンドで削除出来る。 sudo rm -rf /Library/Java/JavaVirtualMachines/jdk<version>.jdk sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -rf /Library/LaunchAg</version>…

.classファイルがターゲットとしているJVMのバージョンを調べる

以下のようにjavapコマンドでバージョンを出力できるので、grepで絞って出すと確認出来る。 javap -v HelloWorld | grep major 参考: d.hatena.ne.jp

TomcatにWarファイルをデプロイし、ブラウザからアクセスすると「Unsupported major.minor version 51.0」エラーが出る

原因はTomcatが使っているJVMのバージョンで実行出来るJavaのバージョンとコンパイル時に使ったJavaのバージョンが異なるため。 具体的にはコンパイル時はJDK1.8を使っていたがTomcatはJDK.7を使っていたためエラーが出た。 Unsupported major.minor version…

tomcatが使用するJavaバージョンを変更する

元々JDK1.7を使っていたが、1.8に変更したくなった。 JDK1.8をインストールしただけでは変更されなかった。 JAVA_HOME環境変数をJDK1.8のパスに変更するとJavaバージョンが変わった。 例えば、以下のように設定する。 JAVA_HOME=%ProgramFiles%\Java\jdk1.8.…

IntelliJでブランチの最新版との差分が出なくなる問題

具体的には以下の現象が起きた。 Editorエリアのはじっこ(ガター)のところに更新した行かどうかが表示されなくなる。正確には変更してすぐは表示されるけど、Diskに保存されたら表示されなくなる Version Control windowに変更したファイルの一覧は出るが…

IntelliJのEditorのアクティブなタブの色をわかりやすくする

標準のdark theme(名前はDelucaだったかな?)にしているとEditorのアクティブタブがどれかわかりにくくて困っていたので もっとわかりやすい色にする設定はないか調べてみた。 Preferences > Appearance & Behavior > File Colors で+ボタンを押し、Scope…

JSFのValidatorにパラメータを渡す

以下のようにf:attributeタグを使ってオブジェクトをValidatorに渡せる。 <h:inputText> <f:validator validatorId="validateEmail" /> <f:attribute name="foo" value="bar" /> </h:inputText> Validatorのコードでは以下のようにしてオブジェクトを取得する。 @Override public void validate(final FacesContext context, final UIComponent component, final Object val…

文字列をBigDecimalやInteger等に変換出来るかどうかを判定する

以下のように例外をキャッチして判定するしかないっぽい。tryParse的なメソッドがあるのかと思ったけど。。無いならしょうがない。 try { new BigDecimal("some string"); // This do nothing because the instance is ignored } catch (NumberFormatExcepti…

ビルド時に「Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.」警告が出る

メッセージは以下。 Warning:(11, 1) java: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)'…

@EJBアノテーションを付けたフィールドにInjectionする時に「com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E」エラーが発生する

以下のようなEJBクラスがあったとする。 @Singleton public class Beans { .... } 以下のように@EJBをつけてオブジェクトをinjectしようとすると、「com.ibm.wsspi.injectionengine.InjectionException: CWNEN0030E」エラーが発生した。 @ManagedBean @ViewS…

Javaではシンボル名に使えない日本語の文字がある

句読点や中黒などはシンボル名に使えない。テストメソッド名を日本語で書いてると句点と中黒は結構使いたくなるんだけどな。。 使えない文字一覧は以下のサイトにある。 参考:

日本語シンボル(メソッド名など)はテストメソッド名でのみ使用する

Javaはメソッド名等に日本語が使えるが、使うと以下の問題がある。 コード補完が効きづらくなる 同じ文字で文字コードが違うことがあるので、エディタ上では全く同じ変数名に見えて実際は違う変数ということがありえる。 例えば、「グ」という文字は「グ」一…

JSFでiOS Safariでテキストフィールドに文字入力後Goをタップした時にPOSTリクエストを送信させない

JSファイルに以下を書く。 window.my = {}; window.my.onkeypress = function() { var ENTER_KEY_CODE = 13; // ENTERが押下された場合、ソフトウェアキーボードを閉じる if (event.keyCode == ENTER_KEY_CODE) { document.activeElement.blur() } // ENTER…

JSFでリクエストがajaxかどうかを判定する

FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest() で判定できる。 FacesContext.getCurrentInstance().isPostback()もたまに使う。 参考:

JavaのDOMParserを使うと「DOMParserは内部所有のAPIであり、今後のリリースで削除される可能性があります」と言われる

DOMParser p = new DOMParser(); のようなコードを書くとコンパイル時に警告が出た。 DOMParserは内部所有のAPIであり、今後のリリースで削除される可能性があります 以下のようにDocumentBuilderFactoryを使うといい。 DocumentBuilderFactory dbFactory = …

型パラメータを含むCastで「Type safety: Unchecked cast from」警告が出たら抑止する

Unchecked cast警告が出たら普通は以下のようにinstanceofで型チェックしてからCastするよう修正する。 if (obj instanceof String) { return (String) obj; } でも型パラメータはコンパイル後に消えるのでinstanceofで厳密に型チェックできない if (obj ins…

JSFの標準エラーメッセージを変更する

以下の手順で変更出来る。 src/main/resources 下にJsfStandardMessage.propertiesのような名前でプロパティファイルを置く faces-config.xmlに以下を追加 <message-bundle>JsfStandardMessage</message-bundle> JsfStandardMessage.propertiesに「javax.faces.converter.IntegerConverter.INT…

JSFで入力欄を空にしても「0」が代入される

以下のようにInteger型のmonthフィールドをbindした場合、画面から入力値を空にしてもmonthには0が入ったままになり、nullにはならない。 <h:inputText id="month" value="#{controller.month}" styleClass="inputText inputText-date"> <f:ajax execute="#{execute}" event="change" /> </h:inputText>月 原因はEL parserのバグで、EL parser内では値をintで扱っているので、nullを0に変換しているから。 以下のJVM O…

Calendar.HOURとHOUR_OF_DAYの違い

add, setなどのメソッドの引数としてCalendar.HOURなどを渡すが、HOURとHOUR_OF_DAYの違いは以下。 ・HOURは12時間表記での時刻 ・HOUR_OF_DAY24時間表記での時刻 HOURを使った場合、午前か午後かはどうやって指定するんだよ。。という気がするが、そこは変…

JSFのconversionフェーズはvalidationフェーズでバリデーションエラーになっても実行される

バリデーションエラーになったらCompositeComponentのgetConvertedValueメソッドは呼ばれないと思っていたら、呼ばれた。まじか。。 以下のようにisValidationFailedをチェックした方が良さそう。 @Override protected Object getConvertedValue(final Faces…

JSFのValidatorにControllerから値を渡す

f:attribute経由で渡せる。以下のようにxhtmlを書くと、 <h:inputText> <f:validator validatorId="validateEmail" /> <f:attribute name="foo" value="#{controller.foo}" /> </h:inputText> Validatorのvalidateメソッドで以下のようにして値を受け取れる。 String foo = component.getAttributes().get("foo"); 参考:

JSFのcomposite componentでpostValidateEventが呼ばれない

以下のようにcomposite component内に<f:event listener="#{cc.validate}" type="postValidate" />を入れてもlistenerが呼ばれなかった。 </f:event>

JSFでajaxでリクエストを送信し、バリデーションエラーになった時に「WARNUNG: There are some unhandled FacesMessages, this means not every FacesMessage had a chance to be rendered.」エラーが出てバリデーションエラーメッセージが画面に表示されない

原因はバリデーションエラーメッセージを表示するh:messageタグがrenderで指定されていないこと。 以下のようにf:ajaxタグのrenderでh:messageのidを指定すると表示された。 <h:inputText id="text3" value="#{bean.text3}"> <f:validateRegex pattern="[A-Z][a-zA-Z]*" /> <f:ajax event="keyup" render="text3message" /> </h:inputText> <h:message id="text3message" for="text3" /> 参…</h:message>

JSFのf:ajaxタグにrender対象を複数指定する

スペース区切りでidを複数書くとそれぞれ更新される。executeなどrender以外も同じ仕様っぽい。 <f:ajax execute="search_form" render="linear1 linear2"/> 参考:</f:ajax>

JSFのViewScopeの落とし穴

ViewScopeでやたらハマるので落とし穴をまとめた。 リクエスト毎にインスタンスが再生成される ViewScopeなのでURLが変わらないうちはインスタンスはずっと保持されるんだろうと思ったら、そうではないっぽい。 初回表示のGET時とPOST BACK時でBacking Bean…

JSF2.0でViewScopeを使う場合、@Namedでなく@ManagedBeanを使う

ViewScopeのBeanを使う場合の注意点。JSF2.0での話なので2.2などでは違うかも。 ・@Namedでなく@ManagedBeanを使う。例は以下。 @ManagedBean @ViewScoped public class ViewController implements Serializable ... ・ViewScopeのBean及びそのインスタンス…