[Seasar-user:18127] Re: [Teeda]forEachでListのDtoにコンポジションしているBeanの中身を出力したい

Takanori Asahara [E-MAIL ADDRESS DELETED]
2009年 7月 30日 (木) 16:43:48 JST


小林さま

お世話になっております。浅原孝経です。

本件、小林さまにご教示いただいた方法の独自コンバータ案で対応し、
無事に動作いたしました。
# HTMLにJSFを記述するよりきれいだと思いまして。

本当にありがとうございました。

ソースコードの方、以下に開示しておきます。

【CodeValueConverter.java】<新規追加>
package foo.annotation.convert;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.seasar.teeda.extension.annotation.convert.Converter;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Converter("codeValueConverter")
public @interface CodeValueConverter {

    String objectMessageId() default "";

    String stringMessageId() default "";

    String target() default "";

}

【CodeValueConverter.java】<新規追加>
package foo.convert;

import javax.faces.component.StateHolder;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import bar.bean.CodeValue;

import org.apache.commons.lang.StringUtils;
import org.seasar.framework.util.AssertionUtil;
import org.seasar.framework.util.StringUtil;

public class CodeValueConverter implements Converter, StateHolder {

    protected String objectMessageId;
    protected String stringMessageId;
    protected boolean transientValue;
    protected String target;
    protected String targets[];

    public static final String CONVERSION_OBJECT_ID;
    public static final String CONVERSION_STRING_ID;
    static {
        CONVERSION_OBJECT_ID = (CodeValueConverter.class).getName() + ".CONVERSION";
        CONVERSION_STRING_ID = (CodeValueConverter.class).getName() + ".CONVERSION_STRING";
    }

    public CodeValueConverter() {
        super();
        transientValue = false;
    }

    @Deprecated
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
        AssertionUtil.assertNotNull("FacesContext", context);
        AssertionUtil.assertNotNull("UIComponent", component);
        if (value == null) {
            return null;
        }
        final CodeValue codeValue = (CodeValue) value;
        return (StringUtils.isEmpty(codeValue.getValue())) ? StringUtils.EMPTY : codeValue.getValue();
    }

    @Override
    public Object saveState(FacesContext context) {
        final Object values[] = new Object[3];
        values[0] = objectMessageId;
        values[1] = stringMessageId;
        values[2] = target;
        return ((Object) (values));
    }

    @Override
    public void restoreState(FacesContext context, Object state) {
        final Object values[] = (Object[]) state;
        objectMessageId = (String) values[0];
        stringMessageId = (String) values[1];
        target = (String) values[2];
        this.setTarget(target);
    }

    public String getObjectMessageId() {
        return StringUtil.isEmpty(this.objectMessageId) ? CONVERSION_OBJECT_ID : this.objectMessageId;
    }

    public void setObjectMessageId(String objectMessageId) {
        this.objectMessageId = objectMessageId;
    }

    public String getStringMessageId() {
        return StringUtil.isEmpty(this.stringMessageId) ? CONVERSION_STRING_ID : this.stringMessageId;
    }

    public void setStringMessageId(String stringMessageId) {
        this.stringMessageId = stringMessageId;
    }

    public String getTarget() {
        return this.target;
    }

    public void setTarget(String target) {
        this.target = target;
        if (StringUtil.isEmpty(target)) {
            return;
        } else {
            targets = StringUtil.split(target, ", ");
            return;
        }
    }

    @Override
    public void setTransient(boolean transientValue) {
        this.transientValue = transientValue;
    }

    @Override
    public boolean isTransient() {
        return this.transientValue;
    }

}

【SyainDto.java】
package bar.dto;

import bar.bean.CodeValue;
import java.io.Serializable;

public class SyainDto implements Serializable {
    private static final long serialVersionUID = 1L;
    // 名前
    private String name;
    // 性別
    private CodeValue sex;
    // 出身国
    private CodeValue country;
}

【CodeValue.java】
package bar.bean;

import java.io.Serializable;

public class CodeValue implements Serializable {
    private static final long serialVersionUID = 1L;
    // コード
    private String code;
    // 値
    private String value;
}

【SyainSearchPage.java】
package foo.web.syain;

import java.util.Arrays;
import java.util.List;

import bar.service.SyainService;

import org.seasar.framework.container.annotation.tiger.Binding;
import org.seasar.framework.container.annotation.tiger.BindingType;

public class SyainSearchPage {

    // SOAPにて社員関連の操作を提供するサービス
    @Binding(bindingType = BindingType.MUST)
    private SyainService syainService;

    // 社員DtoのList
    private List<SyainDto> syainDtoItems;
    // 社員Dto
    private SyainDto syainDto;
    // 名前
    private String name;
    // 性別
    @CodeValueConverter
    private CodeValue sex;
    // 出身国
    @CodeValueConverter
    private CodeValue country;

    public void prerender() {
        // SOAPで社員Dtoの配列(SyainDto[])を取得してjava.util.Listに変換
        syainDtoItems = Arrays.asList(syainService.getSyainArray());
    }

}

【syainSearch.html】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:te="http://www.seasar.org/teeda/extension" xml:lang="ja"
    lang="ja">
<head>
<title id="syainSearchTitle"></title>
</head>
<body>
<table>
    <tbody id="syainDtoItems">
        <tr>
          <td><span id="name"/></td>
          <td><span id="sex"/></td>
          <td><span id="country"/></td>
        </tr>
    </tbody>
</table>
</body>
</html>




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