[Seasar-user:8571] Re: [Teeda]出力時のフォーマットの指定方法について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 6月 21日 (木) 23:00:28 JST


小林 (koichik) です.

Date:    21 Jun 2007 21:52:22 +0900
From:    山下 真里 <[E-MAIL ADDRESS DELETED]>
To:       [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:8568] [Teeda]出力時のフォーマットの指定方法について

> 1.私が思ったのは、S2Dxoから相互変換をする際に指定したフォーマットで
>   変換する方法があるのか?

あります.
S2Dxo のドキュメント「独自のコンバータ」に
記述するつもりなのですが,いつまでたっても
「工事中」のままでご迷惑おかけしてます.m(__)m

S2Dxo では独自のコンバータを作成して
変換先のプロパティごとに指定することができます.

S2Dxo 用のコンバータは
org.seasar.extension.dxo.converter.Converter
を実装したクラスとして作成します.
例えば

public class NumberFormatDxoConverter implements Converter {
  private String format;

  public NumberFormatConverter() {
  }
  public void setFormat(String format) {
    this.format = format
  }
  public Class[] getSourceClasses() {
    return new Class[] {Number.class}; //変換元として受け入れ可能なクラス
  }
  public Class getDestClass() {
    return String.class; //変換先のクラス
  }
  public Object convert(Object source, Class destClass, ConversionContext context) {
    DecimalFormat formatter = new DecimalFormat(format);
    return formatter.format(((Number) source).longValue()); //固有の変換処理
  }
  public void convert(Object source, Object dest, ConversionContext context) {
    throw new UnsupportedOperationException();
  }
}

のようなコンバータを作成します.
クラス名の最後は必ず DxoConverter にしてください.
パッケージは <ルートパッケージ>.converter です.
Teeda のパッケージと同じになるのが気になる場合は
ルートパッケージを別にしてください.

このコンバータを指定するためのアノテーションを作成します.
# 定数アノテーションのみ使うなら不要.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@DxoConverter("numberFormatDxoConverter")
public @interface NumberFormatDxoConverter {
    String format() default "#,##9";
}

@DxoConverter はメタアノテーションで,
コンバータのコンポーネント名を指定します.
# ちょっと冗長ですね.省略時はアノテーションの
# クラス名からとるようにすればよかったかも.

そして変換先 JavaBeans (Page クラス) の
プロパティの setter メソッドに

public class FooPage {

  @NumberFormatDxoConverter
  public void setSomeNumber(String formattedNumber) {
    ...
  }
}

のように指定することで,数値をフォーマットした
文字列に変換することができます.

定数アノテーションの場合は

public static final String someNumber_numberFormatDxoConverter = "format='#,##9'";

のようになります.

いずれもメーラで書いただけで試していません.m(__)m
概ねこんな感じでいけると思います.



--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内