日々精進

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

java

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というプラグインもあったけどこっちはうまく生成でき…

web.xmlの要素には仕様で順序が決まっているものがある

そもそもXMLに順序は関係ないと思っていたが、関係ある場合もあるらしい。 XML Schemaを使うとweb.xmlなど特定の用途に使うXMLの仕様を記述できる。 web.xmlのXML Schemaは http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd で、さらにこれは↓を参照して…

MacでJDKのバージョンを切り替える

インストールされているJDKのバージョン一覧を出す /usr/libexec/java_home -V 現在有効なJDKのバージョンを出す /usr/libexec/java_home JDKのバージョンを切り替える export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_45` 参考:

JavaEEサーバでHTTP通信を禁止し、HTTPSを強制する設定

多分JavaEEサーバであれば何でもこれでいける。以下のようにweb.xmlに書くとHTTPで通信できなくなる。 <security-constraint> <web-resource-collection> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> 参考:

jspの拡張子を変更する

web.xmlに以下を追加すればいい。この例だと拡張子がxyzになる。 <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.xyz</url-pattern> </servlet-mapping> 拡張子なしにしようと思ってurl-patternを*にしたらうまくいかなかった。 参考:

Javaのfor eachは順序が保障されている

for eachでiterateする場合、取り出されるオブジェクトの順序が保障されていない処理系もあるが、 Javaの場合はListをiterateするとindexが0のオブジェクトから順に取り出されることが保障されている。 参考:

Java7でBase64エンコーディング

Java8だとBase64.getEncoder().encodeToString(message);のようにすればいいが、 Java7だとDatatypeConverter.printBase64Binary(message);になる。 参考:

IntelliJとgradleを使っている時にgradleではビルドできるがIntelliJではビルドエラーになる

原因はIntelliJのビルド設定にライブラリへの依存関係が設定されていなかったため。 Project Structure > Modules でアプリモジュールを選択して、Dependencies > +ボタン > Library...からgradleでインストールしたライブラリを選択してOKをクリックすると…

カンマ区切りの数字の文字列をParseしてIntにする

NumberFormatを使用する。コード例は以下。 NumberFormat.getNumberInstance(Locale.US).parse("2,000").intValue() 参考: How to parse number string containing commas into an integer in java?

BigDecimalの小数桁の末尾の0を削除する

BigDecimal#stripTrailingZerosで削除できる。scaleも合わせて変更してくれる。 decimal = decimal.stripTrailingZeros(); 参考: Check if BigDecimal is integer value

JavaでListのリテラルを簡潔に書く

Arrays.asListを使う。 List<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21)); {{}}を使ってもできるらしい。こんなの初めて見た。 仕組みとしては、ArrayListを継承した匿名クラスを定義してその中でaddメソッドを呼んでいるようだ。 List<String> list = ne</string></integer></integer>…