一般来说,BeanUtils自带的Converter基本上可以满足我们在开发过程中的使用了,然而很多时候我们还是需要自定义一些转换器。


MyBean.java

package beanutils;

import java.util.Date;

public class MyBean {

    private String name;
    private int age;
    private Date birthday;
    private boolean isAlive;

    private MyClass myclass;

    public MyClass getMyclass() {
        return myclass;
    }

    public void setMyclass(MyClass myclass) {
        this.myclass = myclass;
    }

    public MyBean() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public boolean isAlive() {
        return isAlive;
    }

    public void setAlive(boolean isAlive) {
        this.isAlive = isAlive;
    }

}

MyClass.java

大家可以看到,这个Bean里面多了一个MyClass的组合类。内容很简单,如下:

package beanutils;

public class MyClass {

    private String classname;

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        this.classname = classname;
    }

}

TestMyBean.java

测试代码如下:

package beanutils;

import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.converters.BooleanConverter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;

public class TestMyBean {

    /**
     * 首先测试的是基本的数据类型
     *
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        String name = "Mark";
        int age = 20;
        boolean isAlive = true;

        MyBean myBean = new MyBean();
        BeanUtils.setProperty(myBean, "name", name);
        BeanUtils.setProperty(myBean, "age", age);
        // 对于boolean貌似不能进行转换
        // BeanUtils.setProperty(myBean, "isAlive", isAlive);
        System.out.println("Print the result by BeanUtils");
        System.out.println("Name:" + myBean.getName());
        System.out.println("Age:" + myBean.getAge());
        System.out.println("IsAlive:" + myBean.isAlive());
    }

    /**
     * 对Date进行转换测试
     *
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        String date = "2016-07-05";
        ConvertUtils.register(new DateLocaleConverter(), Date.class);
        MyBean myBean = new MyBean();
        BeanUtils.setProperty(myBean, "birthday", date);
        System.out.println("Birthday:" + myBean.getBirthday());

    }

    /**
     * 测试boolean类型的数据
     *
     * @throws Exception
     */
    @Test
    public void test3() throws Exception {

        boolean isalive = true;
        ConvertUtils.register(new BooleanConverter(), Boolean.class);
        MyBean myBean = new MyBean();
        BeanUtils.setProperty(myBean, "isAlive", isalive);
        System.out.println("IsAlive:" + myBean.isAlive());
    }

    /**
     * 测试自定义的转换类
     *
     * @throws Exception
     */
    @Test
    public void test4() throws Exception {
        MyClass myclass = new MyClass();
        myclass.setClassname("软测1414班");
        ConvertUtils.register(new Converter() {

            @Override
            public <T> T convert(Class<T> type, Object value) {
                MyClass myclass = (MyClass) value;
                return (T) myclass;
            }

        }, MyClass.class);
        MyBean myBean = new MyBean();
        BeanUtils.setProperty(myBean, "myclass", myclass);
        System.out.println("Customer Converter result:" + myBean.getMyclass().getClassname());

    }
}

其中最关键的就是test4方法,这里采用的是JUnit的方式进行的代码测试,有不清楚的小伙伴们可以查阅一下相关于JUnit的使用哦。

/**
     * 测试自定义的转换类
     *
     * @throws Exception
     */
    @Test
    public void test4() throws Exception {
        MyClass myclass = new MyClass();
        myclass.setClassname("软测1414班");
        ConvertUtils.register(new Converter() {

            @Override
            public <T> T convert(Class<T> type, Object value) {
                MyClass myclass = (MyClass) value;
                return (T) myclass;
            }

        }, MyClass.class);
        MyBean myBean = new MyBean();
        BeanUtils.setProperty(myBean, "myclass", myclass);
        System.out.println("Customer Converter result:" + myBean.getMyclass().getClassname());

    }

我们在代码中定义了一个泛型的转换器,其作用就是专门用于转换MyClass.class。只要遇到了这样的类,这个转换器的回调方法就会起作用。将其转换!这就是BeanUtils的核心思想。

总结

对于转换器而言,我们可以通过自定义一些转换器来减少代码的重复,而且可以更加方便的维护我们的代码。

但是,在具体的使用到一个转换器之前,我们一定要先想想,有没有内置的转换器呢?如果有的话,就不必重复的造轮子了。

下面 我就把BeanUtils内置的常用的转换器罗列一下吧。方便大家浏览。

  • AbstractArrayConverter
  • AbstractConverter
  • ArrayConverter
  • BigDecimalConverter
  • BooleanArrayConverter
  • BooleanConverter
  • ByteArrayConverter
  • ByteConverter
  • CalendarConverter
  • CharacterArrayConverter
  • CharacterConverter
  • ClassConverter
  • ConverterFacade
  • DateCOnverter
  • DateTimeConverter
  • DoubleConverter
  • FloatArrayConverter
  • FileConverter
  • FloatConverter
  • IntegerArrayConverter
  • IntegerConverter
  • LongConverter
  • LondArrayCOnverter
  • NumberConverter
  • ShortArrayConverter
  • ShortConverter
  • SqlTimeConverter
  • SqlTimestampConverter
  • StringArrayConverter
  • StringConverter
  • URLConverter

BeanUtils制作自定义的转换器的更多相关文章

  1. Struts2框架的自定义类型转换器

    前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...

  2. sruts2 自定义类型转换器

    1.1.1    Struts2中自定义类型转换器:(了解) 类型转换的过程是双向的过程: JSP---->Action参数提交:String---Date. Action---->JSP ...

  3. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

  4. Android中制作自定义dialog对话框的实例

    http://www.jb51.net/article/83319.htm   这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...

  5. [原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 自定义类型转换器converter

    作用:目前将日期转换成string,将string转换成我想要的类型   0509课件里讲 一.数据类型转换在web应用程序中,数据存在两个方向上的转换:1.当提交表单时  表单数据以字符串的形式提交 ...

  7. Expression Blend制作自定义按钮(转)

    来源:http://www.cnblogs.com/iChina/archive/2011/11/25/2262854.html Expression Blend制作自定义按钮 1.从Blend工具箱 ...

  8. Ⅵ.spring的点点滴滴--自定义类型转换器

    承接上文 自定义类型转换器 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class CustomeConverter : TypeConverter{ ...

  9. struts2自定义类型转换器

    首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机 ...

随机推荐

  1. “百度杯”CTF比赛 九月场_Code(PhpStorm)

    题目在i春秋ctf大本营 打开链接是一张图片,审查元素发现关键词base64,图片的内容都以base64加密后的形式呈现,查看url形式,应该是一个文件读取的漏洞 这里我们可以采用url/index. ...

  2. [ZJOI 2010]Perm 排列计数

    Description 题库链接 询问有多少个 \(1\sim N\) 的排列 \(P\) 满足" \(\forall i\in[2,N], P_i>P_{\frac{i}{2}}\) ...

  3. bzoj 4547 小奇的集合

    Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...

  4. [SDOI2005]反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  5. Codeforces Round #452 F. Letters Removing

    Description Petya has a string of length n consisting of small and large English letters and digits. ...

  6. DP测试总结

    T1:三取方格数 题目描述 设有N*N的方格图,我们将其中的某些方格填入正整数,而其他的方格中放入0.某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角.在走过的路上,他取走了方格中的数. ...

  7. POJ2774 很长的信息

    Description Little cat在Byterland的首都读物理专业.这些天他收到了一条悲伤地信息:他的母亲生病了.担心买火车票花钱太多(Byterland是一个巨大的国家,因此他坐火车回 ...

  8. 非Unicode编码的软件如何在Windows系统上运行

    我们常常会遇到这样一种情况:点开某些日文软件(我不会说就是galgame( ╯□╰ ))会出现乱码或者直接无法运行. 出现乱码的原因很简单:编码与译码的方式不一致!!!!!!!!!!! 首先大家需要知 ...

  9. gray-code (格雷码)

    题目描述 The gray code(格雷码) is a binary numeral system where two successive values differ in only one bi ...

  10. rsync 系统用户/虚拟用户 备份web服务器数据及无交互定时推送备份

    一.服务环境 (1),WEBserver(192.168.10.130) : BACKserver(192.168.10.129) (2),BACKserver服务器部署,安装所需软件,并启动 (3) ...