`
gegewuqin9
  • 浏览: 28255 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于javabean的转化,写了个公用的方法,抛个砖看看能否引到玉

阅读更多
首先不要怪我写的简陋,我提供的更多是一种思路,而不是直接可以使用的工具,毕竟不是大牛。
先来看一个例子:
这是一个普通的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;
    }
}


由于数据类型有变更,直接用BeanUtil肯定是不行的,但我希望使用通用的一个方法来实现,而不需要特意写一个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> T convertor(Object object, Class<T> clazz) throws Exception {
        T result = clazz.newInstance();
        List<String> excludeFields = new ArrayList<String>();
        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;
    }
}



代码说明:
Convertor:
    1.method:定义了使用哪个解析方法来解析来源字段的值
    2.srcField:定义了取来源对象的哪个字段的字段名称
    3.pattern:为日期类型指定格式化格式
AbstractConvertor:转换器的接口方法,所有转化器都需继承并实现它
ConvertorParam:封装了Convertor中定义好的类型和来源字段的值,做为转换器的参数
CommonConvertor:一个普通的转换器,只是把原值直接赋予给新的对象
DateToStringConvertor:日期转为String的转换器
ConvertorUtil:实现转换的方法

以下是测试结果:
首先修改UserVo,添加了Convertor注解
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.引入组别的概念控制哪些字段需要转换哪些不需要转换
最终实现任何类都可以通过这个方法直接转换,
0
1
分享到:
评论

相关推荐

    用javabean写的投票系统

    用javabean写的投票系统 希望对初学者有所帮助!

    javaBean--jsonObject--jsonString相互转化

    最近在研究Webservice的时候遇到一个问题,把java对象转化问json后传过去,接受的是String类型,怎么恢复到原来的java对象呢,后来再一个项目中看到了转换方法,转换顺序为javaBean--jsonObject--jsonString,还原...

    JavaBean 方法的动态调用

    java javabean 设计模式 动态调用方法 反射 通过这个包可以动态调用一些JavaBean 的方法属性

    JAVABEAN

    一个基于JAVABEAN的BBS系统!

    JSP&javaBean写的简单用户验证

    孙鑫写的示例,简单而且很好理解,源码,JSP,JavaBean

    自己写的一个购物车(jsp+javabean)

    我自己写的一个简单的购物车,采用jsp+javabean实现,doGet提交方式,解压完了之后,自己配置一下包就可以用了

    关于数据库表生成javabean

    用过myeclipse的人都知道,用数据库表结构生成javabean的orm很简单,也很容易,最近项目采用的是eclipse 也遇到的同样的问题,用数据库表生成dmo对象,经过同事的介绍,给我一个生成的工具的工程,中午休息的时候...

    JavaBean简介

    JavaBean简介 什么是JavaBean? JavaBean的三个组成部分 JavaBean的基本特征 BeanInfo接口 JavaBean的开发模式 使用JavaBean开发应用程序 EJB简介

    json对象与javabean相互转化

    json对象与javabean相互转化 JSONObject jsonObj=JSONObject.fromObject(s);//将字符串转化为json对象 //写数据库处理 ObjBean bean=(ObjBean)JSONObject.toBean(jsonObj,ObjBean.class); ObjBean bean=new ...

    JSP+JavaBean方法实现登陆

    1. 该实例使用JSP+JavaBean方法实现。 2. 数据库连接首先使用普通连接方法,然后使用数据库连接池技术。请查看连接数据库的DBConnect.java源文件。 3. 同样需要导入相应的Jar包文件。

    json转javabean工具

    提供json转javabean和javabean转json的方法

    JAVABEAN方法实例

    这是实验课写的程序,能运行!用JAVABEAN方法实现第二个字符串在第一个字符串的位置。

    一个servlet,javabean。的例子

    一个servlet,javabean。的例子一个servlet,javabean。的例子

    JOX实现XML和JavaBean相互转化

    XML和JavaBean相互转化是一个非常有用的工作,用来读写xml的组件很多,比如dom4j, sax, JDom,Digester等,但是很多组件用起来很麻烦,今天给大家推荐一个超级简单的组件JOX, JOX是一套用户XML document和Java ...

    JavaBean示例

    一个JavaBean的小示例,帮助熟悉学习Javabean的使用,实现了一个简单的交互。

    JSP之访问JavaBean的一个简单例子

    JSP之访问JavaBean的一个简单例子 使用useBean,jsp:setProperty,jsp:getProperty使用的一个简单例子 博客参考地址:https://blog.csdn.net/qq_36631076/article/details/79693890

    javabean介绍

    Javabean的介绍,不懂的看看 最初,JavaBean的目的是为了将可以重复使用的软件代码打包标准。特别是用与帮助厂家开发在综合开发环境(IDE)下使用的java软件部件。这些包括如Grid控件,用户可以将该部件拖放到开发...

    用vba编写的生成javabean中get和set方法的工具

    用vba编写的生成javabean中get和set方法的工具。使用时一定要把编号写上。

    JavaBean讲解(上)

    JavaBean讲解,可以看看

    Dozer一个JavaBean至JavaBean映射器

    Dozer是一个Java Bean至Java Bean映射器, 采用递归的方式将数据从一个对象复制到另一个对象。

Global site tag (gtag.js) - Google Analytics