javabeanの転化について、共通の方法を書いて、れんがを投げてみて、玉まで運んでくれますか?

8013 ワード

もっと読む
まず、私の書いた簡単さを責めないでください。私が提供したのはもっと多くの考えです。直接に使えるものではなく、結局大牛ではないです。
まず一例を見てみます。
これは普通のDOです。データベースから取り出したデータです。

import java.util.Date;

public class UserDO {

    private Long userId;

    private Date createTime;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}
ページ表示に変換する必要があります。日付はそのままStringタイプが望ましいです。

public class UserVo {

    private Long   userId;

    private String createTime;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
}
データのタイプが変更されているので、直接BenUtilを使うのは無理ですが、ユニバーサルな方法で実現したいです。特にUserConvertor.javaの種類を書く必要がないです。

UserVo userVo = ConvertorUtil.convertor(userDO, UserVo.class);
*********************************************
以下は私の考えです。
まず考えたのはAnnotationを通じて、Annotationを定義しました。

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

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Convertor {

    Class extends AbstractConvertor> method() default CommonConvertor.class;

    String srcField() default "";

    String pattern() default "yyyy-MM-dd HH:mm:ss";

}

public class ConvertorParam {

    private Object value;

    private String pattern;

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }

    public String getPattern() {
        return pattern;
    }

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }

}

public interface AbstractConvertor {

    public Object transferable(ConvertorParam value);
}

public class CommonConvertor implements AbstractConvertor {

    @Override
    public Object transferable(ConvertorParam value) {
        return value.getValue();
    }

}

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateToStringConvertor implements AbstractConvertor {

    @Override
    public String transferable(ConvertorParam value) {
        SimpleDateFormat sdf = new SimpleDateFormat(value.getPattern());
        if (value.getValue() == null) {
            return null;
        }
        return sdf.format((Date) value.getValue());
    }

}

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;

public class ConvertorUtil {

    public static  T convertor(Object object, Class clazz) throws Exception {
        T result = clazz.newInstance();
        List excludeFields = new ArrayList();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(Convertor.class)) {
                excludeFields.add(field.getName());
                Convertor convertor = field.getAnnotation(Convertor.class);
                ConvertorParam param = new ConvertorParam();
                param.setPattern(convertor.pattern());
                String srcFieldName = convertor.srcField();
                if (StringUtils.isEmpty(srcFieldName)) {
                    srcFieldName = field.getName();
                }
                try {
                    Object value = null;
                    Field srcField = object.getClass().getDeclaredField(srcFieldName);
                    if (srcField == null) {
                        continue;
                    } else if (!srcField.isAccessible()) {
                        srcField.setAccessible(true);
                        value = srcField.get(object);
                        srcField.setAccessible(false);
                    } else {
                        value = srcField.get(object);
                    }
                    param.setValue(value);
                } catch (Exception e) {
                    // no src field exist.
                    continue;
                }
                AbstractConvertor abstractConvertor = convertor.method().newInstance();
                Object realObject = abstractConvertor.transferable(param);
                BeanUtils.setProperty(result, field.getName(), realObject);
            }
        }
        org.springframework.beans.BeanUtils.copyProperties(object, result, excludeFields.toArray(new String[excludeFields.size()]));
        return result;
    }
}

コードの説明:
Covertor:
    1.method:どの解析方法を使ってソースフィールドの値を解析するかを定義しました。
    2.srceField:ソースオブジェクトを取るフィールドの名前を定義しています。
    3.pattern:日付タイプの書式設定を指定する
AbstractConvertor:変換器のインターフェース方法は、すべてのトランスポンダが引き継ぎ、それを実現する必要があります。
Covertor Param:Covertorで定義されているタイプとソースフィールドの値をパッケージ化し、変換器のパラメータとして使用します。
Common Covertor:普通の変換器で、元の値を直接新しい対象に与えるだけです。
DateToStering Covertor:日付をStringに変換するコンバータ
CoverterUtil:変換を実現する方法
以下はテスト結果です。
まずUserVoを修正し、Covertorコメントを追加しました。

public class UserVo {

    private Long   userId;

    @Convertor(method = DateToStringConvertor.class, pattern = "yyyy-MM-dd")
    private String createTime;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "UserVo [userId=" + userId + ", createTime=" + createTime + "]";
    }
}
テスト方法:

import java.util.Date;

import org.junit.Test;

public class ConvertorUtilTest {

    @Test
    public void testConvertor() {
        UserDO userDO = new UserDO();
        userDO.setUserId(1111L);
        userDO.setCreateTime(new Date());
        try {
            UserVo userVo = ConvertorUtil.convertor(userDO, UserVo.class);
            System.out.println(userVo);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
結果:
UserVo[userId=1111,createTime=2016-07-18]
編集後の言葉:
時間は限られています。まずそれをメモしてから、時間があれば改善します。
私の考えでは、また導入してもいいです。
1.SpringのBeanによって変換する
2.列挙類による変換
3.グループの概念を導入して、どのフィールドをコントロールするかは、どのような変換が必要ですか?
最終的にどのクラスもこの方法で直接変換できます。