javabeanの転化について、共通の方法を書いて、れんがを投げてみて、玉まで運んでくれますか?
もっと読む
まず、私の書いた簡単さを責めないでください。私が提供したのはもっと多くの考えです。直接に使えるものではなく、結局大牛ではないです。
まず一例を見てみます。
これは普通のDOです。データベースから取り出したデータです。
以下は私の考えです。
まず考えたのはAnnotationを通じて、Annotationを定義しました。
Covertor:
1.method:どの解析方法を使ってソースフィールドの値を解析するかを定義しました。
2.srceField:ソースオブジェクトを取るフィールドの名前を定義しています。
3.pattern:日付タイプの書式設定を指定する
AbstractConvertor:変換器のインターフェース方法は、すべてのトランスポンダが引き継ぎ、それを実現する必要があります。
Covertor Param:Covertorで定義されているタイプとソースフィールドの値をパッケージ化し、変換器のパラメータとして使用します。
Common Covertor:普通の変換器で、元の値を直接新しい対象に与えるだけです。
DateToStering Covertor:日付をStringに変換するコンバータ
CoverterUtil:変換を実現する方法
以下はテスト結果です。
まずUserVoを修正し、Covertorコメントを追加しました。
UserVo[userId=1111,createTime=2016-07-18]
編集後の言葉:
時間は限られています。まずそれをメモしてから、時間があれば改善します。
私の考えでは、また導入してもいいです。
1.SpringのBeanによって変換する
2.列挙類による変換
3.グループの概念を導入して、どのフィールドをコントロールするかは、どのような変換が必要ですか?
最終的にどのクラスもこの方法で直接変換できます。
まず、私の書いた簡単さを責めないでください。私が提供したのはもっと多くの考えです。直接に使えるものではなく、結局大牛ではないです。
まず一例を見てみます。
これは普通の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.グループの概念を導入して、どのフィールドをコントロールするかは、どのような変換が必要ですか?
最終的にどのクラスもこの方法で直接変換できます。