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

日々精進

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

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及びそのインスタンス…

JVM optionを使って接続先サーバを切り替える

接続先を開発環境にしたり、本番環境にしたりと変更したい場合。 javaのDオプションで環境名を渡す java -Denvironment=test sampleServer そうすると System.getProperty("environment") で環境名を取得出来るのでそれを元に接続先を切り替えれば良い。 参…

JSFでvalidationフェーズでのvalidation結果がOKだったかどうかを判別する

FacesContext#isValidationFailed() でわかる。 参考: http://docs.oracle.com/javaee/6/api/javax/faces/context/FacesContext.html#isValidationFailed%28%29

websphereにwarをデプロイしても一部のリソースファイルがデプロイされない

すごい謎な現象だった。。一部のファイルがデプロイされないことがあり、デプロイされないファイルの共通点が無いので原因がわかりにくかった。 原因は、GoogleDriveアプリが作る「Icon」という名前のファイルがresources/imgフォルダにあったこと。Iconファ…

JSFのui:repeatで各行に付けたボタンのクリックイベントハンドラにindexかオブジェクトを渡す

JSFではui:repeatを使って繰り返しを表現することが多い。 以下のようにするとイベントハンドラにindexを渡せる。 <ui:repeat items="#{Hoge.items}" var="item" varStatus="stat"> <h:commnadButton action="#{Hoge.hogeAction( stat.index )}" value="押してね♪"/> </ui:repeat> 以下のようにするとイベントハンドラにオブジェクトを渡せる。

Javaでresources下のファイルを読み込む

resources下にあるテキストファイルをなるべく簡単にまるっと読み込む方法。BufferedReaderとか使って1行ずつ読み込むのはだるい。。 以下のようにするとpathはresourcesからの相対パスで指定出来るし、まるっと読み込めるのでいい感じ。 String path = getC…

JavaでXMLをparseする

JavaだとXPathとかSelectorとか使えないからXMLからデータを取り出しづらい。。 XMLParserはAbstractクラスなので、DOMParserを使う。 コード例は以下。 DOMParser parser = new DOMParser(); InputStream bais = new ByteArrayInputStream(xmlString.getByt…

IntelliJ+JRebelでデバッグ実行すると「Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Default Executor-thread-8"」エラー

原因はJVMに割り当てられているメモリが足りないため。 Run/Debug Configuration > VM options に -XX:MaxPermSize=128m を追加すると直った。 参考:

IntelliJ+JRebelでデバッグ実行している時にブレークポイントに止まらない、変数がwatchウィンドウで見られない

原因はコードがコンパイルされないことだった。何らかのきっかけで前回コンパイル時からコードが変更されているのに、変更が検知されず 何度コンパイルしても新しいコードがコンパイルされない状態になっていた。 以下の環境で発生した。 IntelliJ、JRebel、…

JSFで「Note, this message is only sent, because project stage is development and no other error listeners are registered.」エラー

ボタンをクリックした時に掲題のエラーが出た。原因はajaxリクエストと通常のPOSTリクエストを重複して送ってしまっているため。 通常のリクエストを送信するコード(onlick="this.form.submit()"とか)を削除したら直った。 参考:

WAS 8.5.5.7でimmediate=trueにするとFlashが保持するデータがすべてnullになる

原因はMyFacesのバグ。WASのJSF実装はApache MyFacesをベースにしていくらか追加実装をして実装しているっぽい。 FlashImplクラスはMyFacesのものを使っているようだが、MyFaces 2.1.8にはimmediate=trueにすると遷移先画面でFlash#getの結果がnullになって…

IntelliJのUpdate applicationを実行すると「intellij update application operation not supported by vm」エラー

原因は、クラスのシグネチャが変更後にUpdate applicationを実行したため。 JVMはクラスのシグネチャが変わらない限りにおいてHot Swapできるようになっている。 クラスのシグネチャが変更後にUpdate applicationしたい場合はJRebelを使う。 でもJRebelは高…

WASにinstallするfeatureを追加したら、IntelliJでビルドエラーが出る問題

基本的なことなんだけど、IntelliJからビルドする時はgradleでビルドしてないということを意識してなかった。。 なのでWASのfeatureを追加したら、追加したfeatureに対応するjarを取り込んでからコードをビルドするようにしてやらないといけない。 gradle cl…

IntelliJでMANIFEST.MFから依存するJarを取り込んでビルドできるようにする

上記記事でfeatureManagerからWASにインストールしたFeatureのjarをコンパイル時に取り込む方法を紹介したが、 これを使ってできたapi.jarにはFeatureのjar本体は含まれず、そのパスのみ入っている。 何も設定しないとIntelliJはパスからjar本体を読み込んで…

IntelliJでビルドすると、lombokで生成されるはずのメソッドがビルドエラーになる

設定でAnnotation Processorを有効にしないとメソッド生成してくれないらしい。 Settings -> Compiler -> Annotation Processors -> Enable annotation processingにチェックをつけるとビルドできた。 参考:

JSFで「Target Unreachable, identifier '...' resolved to null」エラー

原因はWEB-INF/beans.xmlが無いことだった。全く設定する必要が無い場合でも空ファイルを置かないといけないらしい。なんだそれ。。

IntelliJのArtifactの設定等についているexplodedの意味

通常Artifactはwarファイル等に固めるところ、固めずそのまま配置するという意味。 初見でどういう意味か分からなかった。。 参考: https://www.jetbrains.com/idea/help/configuring-web-application-deployment.html

wsdl2javaはApache CXFとApache Axis2に含まれる

両方SOAPサービスを実装するためにFWだけど、 両方にWSDLからJavaクラスを生成するwsdl2javaが含まれていて、微妙に仕様が違う。 Apache Axis2のwsdl2javaからサーバ実装のスケルトンを生成したところAxis2のクラスを継承していて使いづらかった。 CXFの方が…

gradleで既存のsourceSetへの異存があるsourceSetを追加するとコンパイルエラーになる

既存のsourceSetのクラスへの依存関係を設定しないといけないが、そのやり方が分からなくて困った。 以下のようにclasspathを追加すると、src/main下にあるクラスをsrc/intTest下のクラスから利用できる。 sourceSets { intTest { java { compileClasspath +…

gradleのtaskの依存関係を削除する方法がないっぽい

wsdl2java pluginがwsdl2javaタスクをcompileJavaタスクに依存させているせいで buildする度にjavaファイルが生成されて困る。 コマンドラインからはgradle build -x wsdl2javaのようにしてタスクを切れるけど毎回-x書くのはいやだ。。 compileJava.taskDepe…

gradleでwsdlからjavaファイルを生成する

Web SphereのドキュメントにはAntタスクを実行する〜とか書いてるけど、Ant使いたくない。。 のでGradleプラグインを探したところ、wsdl2javaプラグインがあったのでこれで生成した。 gradle-wsdl-pluginというプラグインもあったけどこっちはうまく生成でき…