Teedaでも列挙
今回の案件は小さめなので、今後のために色々実験台になってもらおうと、Teeda + DBFluteを導入。面白い。
で、Dxoで列挙変換がサポートされたので、これをHTMLにレンダリングする際にこれまた変換かけるようにしてみる。
取り敢えず今回の案件は登録処理はないので、列挙→文字列のみ考える。送信ステータスで成功、失敗を管理する場合。
public enum SendStatus { SUCEES("成功"), ERROR("失敗"); private String label; private SendStatus(String label) { this.label = label; } public String toString() { return label; } }
Dxoでの変換は、Enum#nameを見るので、影響は無い。一見落着じゃ。
でもこれじゃあつまらんし、こう云う搦め手は好かん。ここは独自仕様で突っ走りましょうってんで、インタフェースを定義しました。
public interface LabelEnum { String getLabel(); }
先程の列挙はこのインタフェースを実装する形にします。
public enum SendStatus implements LabelEnum{ SUCEES("成功"), ERROR("失敗"); private String label; private SendStatus(String label) { this.label = label; } public String getLabel() { return label; } }
このインタフェースを実装した列挙専用のConverterを作りましょう。って資料がないので見よう見真似でやってみました。
まず、Converter本体、TLabelEnumConverter。列挙→文字列のみであいすみませんが。
public class TLabelEnumConverter implements Converter { public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException { //TODO あとで書く return null; } public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException { AssertionUtil.assertNotNull("FacesContext", context); AssertionUtil.assertNotNull("UIComponent", component); if (value == null) { return ""; } try { return (value instanceof String) ? (String) value : ((LabelEnum) value).getLabel(); } catch (Exception e) { throw ConvertUtil.wrappedByConverterException(e); } } }
そしてこのConverterを指定するアノテーション、LabelEnumConverterを作ります。
@Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.FIELD, ElementType.METHOD }) @Converter("TLabelEnumConverter") public @interface LabelEnumConverter { }
めでたく動きましたです。
DBから文字列で取ってきて、列挙に変換してそれをHTMLにレンダリングするのにまた文字列に変換。回りくどいけど、これで開発者がコーディングする部分では区分やステータスなどの値や文言を見る事はなくなったのであった。
登録する時は、SUCCESSとかERRORとか文字列で送ってやれば変換かかるようになればいいからこれはname見ればいいし、LabelEnumじゃないPOJE(Plain Old Java Enum、今考えた)でも出来そうだな。けど今回は要するにバッチ処理の監視機能なので要らないのでやらない。