如何将2个不同的对象映射在一起

时间:2009-12-22 01:45:57

标签: java xml web-services proxy

在我目前的项目中,我有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对象作为参数。

知道如何解决这个问题吗?请给我一些建议。

5 个答案:

答案 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(注意,这是一个浅层副本)