(注:このブログはもう更新していません)この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

[クラウド帳票エンジンDocurain]

Java

JavaMailプロパティ一覧

このサイトがとても良くまとまっていて便利。http://www.java-email.com/content/view/38/60/ (今日は手抜きです)

メール送信を簡単に単体テストする

ちかごろ、僕が関与する案件では、アプリからJavaMailでメール送信することが多いです。 で、コードを書くのは簡単なのですが、単体テストが大変という。 JavaMailって何気にクセが強いので、実際にSMTPで送ってみないと コードがうまくできてるかどうか、分…

メソッドがオーバーライドされたか否かを実行時に調べる

例えばフックメソッドなど、オーバーライドされることで初めて意味を成すメソッドが有ります。 例えば、こんな感じ。onMethodメソッドとonFieldメソッドがそうです。 public class ClassInspector { public void inspect(Class clazz) { for (Class cls = cl…

スレッドローカルを使うハメになるのは設計ミスだと言ってみる

スレッドローカルは便利なクラスです。 いつでもどこでもスレッドセーフなグローバル変数を定義することができます。 ごく稀にですが、スレッドローカルを使わないと解決できない問題もあるでしょう。 しかし、思うのです。スレッドローカルを使うのは基本的…

Tomcat付属のannotation-api.jarがヘン

Tomcat-6.0.20のlibディレクトリ配下に、annotation-api.jarがあります。 このjarを展開し、javax.annotaion.Generated.classを逆コンパイルすると… // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.co…

SAXパーサーでXMLのwell-formednessを検証する

いま、XMLをApache Digesterでパースするコードを書いているのですが、 (それにしても、DigesterのAPIはホントにわかりづらいなぁ…メソッド名が直感的じゃないというか) not well-formedなXMLを読ませようとすると、 org.xml.sax.SAXParseException: The ele…

RequestDumperValve=文字化け

お前が犯人か〜〜〜!!!! 今日、POSTパラメータが文字化けするという問題と4時間くらい格闘していたのですが。バイナリエディタまで引っ張り出してきて、文字化けの原因を探ったり。 僕にとってバイナリエディタを使うというのは、針の穴に糸を通す行為と…

クラスメンバーのメタ情報はイレイジャによって消されずに残る

これまで、Genericsのパラメータ型("Set"における"String"のこと)は、ランタイム時にはイレイジャによってすべて消されるものと思い込んでいました。(クラス除く) しかし、どうやら"フィールド"および"メソッドの引数&戻り値"については、ランタイム時にパ…

package-info.javaはインターフェースとしてコンパイルされる

さっきEclipseのバイトコードタブを見て知ったのですが。package-info.javaは、パッケージプライベートな空のインターフェースとしてコンパイルされます。ソースはこんな感じ。 // class version 50.0 (50) // access flags 5632 abstract interface jp/root…

single-check idiom ?

先程、これの10章を読み終えました。Effective Java (Java Series)作者: Joshua Bloch出版社/メーカー: Prentice Hall発売日: 2008/05/08メディア: ペーパーバック購入: 6人 クリック: 65回この商品を含むブログ (42件) を見る 284ページの内容がちょっと面…

Maven Repo Search

mavenやivyを使っていると「あのJarファイルはどのMavenリポジトリに入っているんだろう?」と思うことが良くあります。 その度に、一々リポジトリを見に行って探す必要がありました。 そんなあなたにMaven Repo Search。 これを使えば一発検索できます。あ…

ECJではOKで、javacだとNGな例

EclipseのコンパイラとJDKのコンパイラは別物です。 ECJでコンパイルできても、javacでコンパイルできないことがあります。 では、どんなケースがjavacではダメなのか。 その一部を紹介します。 ケース1: アノテーションの属性値配列の、最後の要素のカンマ …

!(A || B) ではなく (!A && !B) と書くべき

コーディングをしていて、こういうケースって非常によくありますよね。 void method(Object arg0, Object arg1) { if (!((arg0 == null) || (arg1 == null))) { ... } } (以下、この書き方を「最後に否定」パターンと呼ぶ) このコードは、こう書くこともでき…

XercesのおかげでWebアプリケーションリロードが失敗

Java界におけるXMLパーサーの標準実装といえばXerces。 最近はXMLを扱わないWebアプリケーションは滅多にない(設定ファイルとかは大抵XML)と思うので、非常に高い確率でxercesImpl.jarを(間接的に)使っていると思います。 ところがこのXerces、Webアプリケー…

『OracleのIN句の引数は1000個まで』問題

Oracleには、IN句の引数が1000個までという制限(※)があります。(※) Oracleのアーキテクチャ上、IN句の最適化が難しいためにわざと設けた制限であると、どこかで読んだ気が。 JPQLにもIN句があるので、 『OracleでJPAを使用した場合は同様の制限があるのかも…

Eclipse上のsubversionクライアントでchecksum mismatchエラー

ちょっとしたtip。Eclipse上のSubversionクライアントでファイルを更新するとき、たまに"checksum mismatch"というエラーを吐いて先に進めなくなる時があります。そういう時は次のようにするとよいです。 エクスプローラーなどで、Eclipseの外から当該ファイ…

IvyDE 2.0.0-RELEASE

いつの間にかIvyDE 2.0.0がリリースされていた。 IvyDE-2.0.0-betaには、jarファイルに対応するソースコードを自動ダウンロード&アタッチしてくれないという、デバッグ時に大変困るバグ(※)があったのだが、解消された模様。よかったよかった。(※) ちなみにI…

requestスコープとcomponent-scanの併用

弊社のプロダクトであるR42フレームワークでは、Spring2.5で追加された機能であるを使用することで、特定のクラスを自動的にコンポーネントとしてBeanリポジトリに取り込んでいます。これにより、開発者がApplicationContext.xmlを一切書く必要がない開発を…

Spring or Seasar ?

某巨大掲示板のSeasarスレでSpringとの比較が議論されていた。 全部読んだわけではないけど、僕の理解をまとめると 日本語限定なら情報量はSeasarのほうが多い。英語も含めるならSpringのほうがもっと多い Springは、(中〜大規模開発を見据えた)オレオレフレ…

Query#getResultListでConcurrentModificationException?

EclipseLink(1.1.2)が良く分からないエラーを吐く。何でConcurrentModificationExceptionになるんだろう。 java.util.ConcurrentModificationException java.util.IdentityHashMap$IdentityHashMapIterator.nextIndex(IdentityHashMap.java:715) java.util.I…

依存先プロジェクトのクラスを再デプロイする

6/25の日記で、Eclipseのプロジェクト依存関係を設定する方法を紹介しました。 今日はそれに関連した小ネタを一つ。 例えば、r42fw_sampleというプロジェクトがr42fwというプロジェクトに依存しているとき、 r42fwを修正しても、修正済みクラスは/WEB-INF/cl…

OGNL式で存在しないプロパティへアクセス

先程まで、OGNL式の謎の例外に悩まされていたのですが、 Caused by: java.lang.NullPointerException at com.opensymphony.xwork2.ognl.OgnlValueStack.checkForInvalidProperties(OgnlValueStack.java:298) at com.opensymphony.xwork2.ognl.OgnlValueStack…

struts-2.1.6とxwork-2.1.4

現行最新版のStruts2はstruts-2.1.6であり、それに対応するXWorkはxwork-2.1.2です。 でも、XWorkの最新版は2.1.4です。そこで、XWorkを入れ替えて最新にしてみました。すると… Caused by: java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/Te…

更新系ユースケースにおけるフィールド初期値の復元

確認画面付きの更新系のユースケースにおいては、入力画面を表示するときに最初に一度だけ初期値を復元する必要があります。このとき、入力フィールドに初期値を表示するために(#initialValueOfHogeはどこかから持ってきた値とする) <s:textfield name="hoge" value="#initialValueOfHoge" /> と書いてしまうとダメで</s:textfield>…

iteratorタグの落とし穴

Struts2のタグは、リストをforeachループでまわしてそれぞれの要素を操作する場合に使用するタグです。 ごく簡単なWebアプリケーションを作成する場合ですら、必須のタグであると言って良いです。たぶん。 しかしながら、にはある落とし穴が存在します。 落…

Genericsなメソッド呼び出し時の型パラメータ強制指定構文

最近、Effective Java第二版を読んでいるのですが(英語の訓練も兼ねて洋書を)、 面白い構文があったのでご紹介します。Effective Java (Java Series)作者: Joshua Bloch出版社/メーカー: Prentice Hall発売日: 2008/05/08メディア: ペーパーバック購入: 6人 …

Eclipseでプロジェクト依存関係を設定する

大規模なプロジェクト(ここでいう「プロジェクト」は「案件」ではなくEclipseのプロジェクトを指す)では、複数のサブプロジェクトに分割して開発することが多々あると思います。そして、共通モジュールプロジェクトのように、他のプロジェクトが依存するプロ…

コードレベルで変数のスコープを管理するカスタムタグ

初めまして。ルート42株式会社の高橋と申します。 弊社では自社プロダクトの一つとしてフルスタックフレームワークの構築をしています。 その過程で得られたノウハウを、備忘録も兼ねてブログで公開してみることにしました。 不定期の更新になると思いますが…