2009-12-22 103 views
1

在我目前的项目中,我有2个模块ModuleA和ModuleB,并且在ModuleA和ModuleB内部有一个名为'Student'的类(相同的类名,相同的属性,但出于某种目的,ModuleA必须调用ModuleB来完成实际的任务)。他们通过Web服务相互沟通。现在我想让ModuleA Web服务调用ModuleB代理来完成实际的任务。如何映射2个不同的对象在一起

在我ModuleA Web服务我要创建一个记录的方法:

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对象作为参数。

任何想法如何处理这个问题?请给我一些建议。

+1

方式通过添加注释太多额外的限制......这是一个家庭作业? – Nate 2009-12-22 05:26:17

回答

0

循环依赖关系==糟糕的设计。

重新设计模块以消除循环依赖。

+0

对不起,我什么都没有。为什么你不能重新设计?如果它不起作用,你现在的代码为你做了什么? – duffymo 2009-12-22 10:52:25

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); 

上面的例子假设所有的领域都是私有的。如果它们不是,那么可以用方法(模块映射设置者名称到getter名称)完成相同的操作。

+0

你有几个类似的课程? ^^ – akuhn 2009-12-22 15:04:09

+0

嗨阿德里安谢谢,我试过你的方法反映对象没有错误,但它回报我没有价值,学生的价值将不会反映到studentB? – user236501 2009-12-23 01:19:20

+0

我不明白,你能改说你的问题吗? 'convert'方法应该将所有属性从A复制到B,因此为了将值从B返回到A,必须再次调用'convert'。 – akuhn 2009-12-23 15:38:00

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); 
+0

你用来访问WebService的框架是什么?大多数WS框架(如Axis2)将使用一些绑定框架将对象基于wsdl编组为xml。绑定框架在wsdl编译期间提供了toXml()以及像StudentDocument这样的辅助类的实现。 – BSingh 2009-12-22 15:41:39

+0

我正在使用JAXB将java绑定到xml – user236501 2009-12-23 02:10:06

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); 

UPDATE
因为你的对象在这两个包中是相同的,所以你建立一个web服务,我会建议这个Simple framework,其实它叫Simple。 Simple可以帮助您将对象序列化为XML并将其反序列化,非常简单。

相关问题