在我目前的项目中,我有2个模块ModuleA和ModuleB,而在ModuleA和ModuleB中,我有一个名为'Student'的类(相同的类名,相同的属性,但出于某种目的,ModuleA必须调用ModuleB来执行实际任务) 。它们通过Web服务相互通信。现在我希望ModuleA Web服务调用ModuleB代理来完成实际任务。
在我的ModuleA网络服务中,我有一种创建记录的方法:
public void createStudent(ModuleA.Student student){
// Here will call ModuleB proxy to do the actual task which is create.
*moduleBFacade().createStudent( );*
}
在我的ModuleB代理中:
public void createStudent(ModuleB.Student student){}
所以现在的问题是,我无法将moduleA对象传递给createStudent方法,因为它只将moduleB对象作为参数。
知道如何解决这个问题吗?请给我一些建议。
答案 0 :(得分:1)
您无法在Java中更改对象的类。此外,您不能将两个类“合并”到一个类中。你可以做的是引入一个通用接口,但为此你必须拥有这两个类的源代码。
考虑到您可以更改这两个类的约束,然后手动将ModuleA.Student
转换为ModuleB.Student
并返回是您获得的最佳选择。
PS:作为替代方案,您可以使用反射。鉴于这两个类具有相同的属性名称,那么从一个类到另一个类的映射应该不是问题。
public static <A,B> B convert(A instance, Class<B> targetClass) throws Exception {
B target = (B) targetClass.newInstance();
for (Field targetField: targetClass.getFields()) {
Field field = instance.getClass().getField(targetField.getName());
targetField.set(target, field.get(instance));
}
return target;
}
用法:的
StudentB studentB = convert(studentA, StudentB.class);
上面的例子假设所有字段都是私有的。如果不是,则可以使用方法(模块将setter名称映射到getter名称)完成相同的操作。
答案 1 :(得分:1)
当您使用WS调用时,可以将moduleA.Student转换为xml,然后更改xml的命名空间,然后从xml实例化moduleB.Student对象。
类似的东西:
String xmlA = moduleA.Student.toXml();
//Change namespace. Also, Compare the genrated xml of ModuleA and ModuleB.
ModuleB.BStudent studentB= StudentDocument.Factory.parse(xmlA, ..);//second argument can be diff namespace
*moduleBFacade().createStudent(studentB);
答案 2 :(得分:0)
循环依赖==糟糕的设计。
重新设计模块以删除循环依赖项。
答案 3 :(得分:0)
可能听起来不对,但在这里:
Java代码
假设通过的学生对象是ModuleAStudent
//create a new bStudent with main criteria
ModuleBStudent bStudent = new ModuleBStudent();
bStudent.setStudentId(student.getStudentId());
bStudent.setStudentNo(student.getStudentNo());
//finally
moduleBFacade().createStudent(bStudent);
<强>更新强>
由于你的对象在两个包中是相同的,而你正在建立一个Web服务,我建议这个Simple framework,实际上它叫做Simple。 Simple可以帮助您将对象序列化为XML并将其反序列化,非常简单。
答案 4 :(得分:0)
您可以使用BeanUtils.copyProperties复制到类似的bean(注意,这是一个浅层副本)