为来自不同包的对象创建一个通用转换器

时间:2011-09-27 10:08:25

标签: java web-services generics

我有5个web服务,A,B,C,D和E.每个都有自动生成的对象,结构完全相同,但名称不同,包装不同。

com.ws.a.carA contains  parameters and com.ws.a.wheelA
com.ws.b.carB contains  parameters and com.ws.b.wheelB
com.ws.c.carC contains  parameters and com.ws.c.wheelC
com.ws.d.carD contains  parameters and com.ws.d.wheelD
com.ws.e.carE contains  parameters and com.ws.e.wheelE

我想创建一个函数,可以将每个对象(和内轮)转换为名为

的对象
com.model.car,

但我不会有很多功能:

com.model.car convert(com.ws.a.objA obj)
com.model.car convert(com.ws.b.objB obj)

...

问题是,我无法为所有对象提供实现的通用接口,因为我不想手动更改自动生成的类(它们经常被重新创建)。

我需要一种方法,可能用泛型来创建一个共同的功能

com.model.car convert(T obj)

适用于所有车型,但我不确定如何实施。

4 个答案:

答案 0 :(得分:4)

您可以使用反射。最简单,最干净的方法可能是使用Apache Common BeanUtilsPropertyUtils#copyPropertiesBeanUtils#copyProperties

PropertyUtils #copyProperties将值从一个对象复制到另一个对象,其中字段名称相同。因此,对于copyProperties(dest,orig),它会为两个对象中存在的所有字段调用dest.setFoo(orig.getFoo())。

BeanUtils #copyProperties也是这样做的,但你可以注册转换器,以便在必要时将值从String转换为Int。有许多标准转换器,但你可以注册自己的,在你的情况下com.ws.a.wheelA到com.model.wheel,或其他什么。

答案 1 :(得分:2)

您还可以查看Dozer

答案 2 :(得分:0)

我认为你应该考虑使用reflection

答案 3 :(得分:0)

使用commons beanutils库可以执行以下实用程序类:

public class BeanUtilCopy {
    private static BeanUtilsBean beanUtilsBean;
    private static ConvertUtilsBean convertUtilsBean = new ConvertUtilsBean();
    static {                   
        convertUtilsBean.register(new Converter() { //2
            public <T> T convert(Class<T> type, Object value) {
                T dest = null;
                try {
                    dest = type.newInstance();
                    BeanUtils.copyProperties(dest, value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return dest;
            }
        }, Wheel.class);
    beanUtilsBean = new BeanUtilsBean(convertUtilsBean);
}

    public static void copyBean(Object dest, Object orig) throws Exception {
        beanUtilsBean.copyProperties(dest, orig); //1
    }

当(1)beanUtilsBean使用转换器(2)将Wheel ** X **值传递给目标bean中的Wheel时。

使用示例:

    CarB carB = new CarB();
    carB.setName("car B name");
    carB.setWeight(115);
    WheelB wheelB = new WheelB();
    wheelB.setName("wheel B name");
    wheelB.setType(05);

    carB.setWheel(wheelB);

    Car car1 = new Car();
    BeanUtilCopy.copyBean(car1, carB);

    System.out.println(car1.getName());
    System.out.println(car1.getWeight());
    System.out.println(car1.getWheel().getName());
    System.out.println(car1.getWheel().getType());

输出:

车B名称

115

轮B名称

5