Java 为来自不同包的对象创建公共转换器
我有5个Web服务,A、B、C、D和E。每个Web服务都有完全相同结构的自动生成对象,但具有不同的名称和不同的包Java 为来自不同包的对象创建公共转换器,java,web-services,generics,Java,Web Services,Generics,我有5个Web服务,A、B、C、D和E。每个Web服务都有完全相同结构的自动生成对象,但具有不同的名称和不同的包 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 para
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)
<>这将适用于所有的汽车类型,但我不知道如何实现它。 < P>我认为你应该考虑使用.< /P> < P>你可以使用反射来进行这项工作。最简单、最干净的方法可能是使用,或者 PropertyUtils#copyProperties将值从一个对象复制到另一个对象,其中字段名相同。因此,对于copyProperties(dest,orig),它为两个对象中存在的所有字段调用dest.setFoo(orig.getFoo())
BeanUtils#copyProperties也有相同的功能,但您可以注册转换器,以便在必要时将值从字符串转换为Int。有许多标准转换器,但您可以注册自己的转换器,例如com.ws.a.wheelA到com.model.wheel或其他任何类型。您也可以使用commons beanutils library签出您可以执行以下实用程序类:
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
}
输出:
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());
车名
115
车轮B名称
五,