自定义BeanUtils转换器未调用

时间:2012-07-17 19:13:23

标签: java apache-commons-beanutils

我正在尝试编写自己的bean utils转换器,以便将对象导出为纯文本文件

我有主要课程

 public class BeanUtilsTest {
    public static void main(String[] args) {
        try{
        MyObject myObject = new MyObject();
        myObject.setId(3l);
        myObject.setName("My Name");

        ConvertUtilsBean cub = new ConvertUtilsBean();
        cub.deregister(String.class);
        cub.register(new MyStringConverter(), String.class);
        cub.deregister(Long.class);
        cub.register(new MyLongConverter(), Long.class);

        System.out.println(cub.lookup(String.class));
        System.out.println(cub.lookup(Long.class));

        BeanUtilsBean bub = new BeanUtilsBean(cub, new PropertyUtilsBean());

        String name = bub.getProperty(myObject, "name");
        System.out.println(name);
        String id = bub.getProperty(myObject, "id");
        System.out.println(id);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

长转换器

public class MyLongConverter implements Converter{

    @Override
    public Object convert(Class clazz, Object value) {
        System.out.println("Long convert");
        return value.toString()+"l";
    }

}

字符串转换器

public class MyStringConverter implements Converter{

    @Override
    public Object convert(Class clazz, Object value) {
        System.out.println("String convert");
        return value.toString()+":";
    }
}

最后我的对象

public class MyObject {
    Long id; 
    String name;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

输出

String convert
My Name:
String convert
3:

我期待id会通过MyLongConverter,但似乎它仍然通过String一个。为什么以及如何解决这个问题?

请指教 感谢

1 个答案:

答案 0 :(得分:0)

String id = bub.getProperty(myObject, "id");

getProperty类中的BeanUtilBean函数必须返回您请求的属性的String表示,无论该属性的定义格式如何。因此,它始终使用String转换器(MyStringConverter)。

由于此处的目标类型始终为String,因此永远不会使用MyLongConverter

相反,MyStringConverter应检查value参数的类型,并相应地将其转换为String