2009-12-22 2 views
1

В моем текущем проекте у меня есть 2 модуля ModuleA и ModuleB, а внутри ModuleA и ModuleB у меня есть класс под названием 'Student' (то же имя класса, те же атрибуты, но для некоторой цели ModuleA должен вызывать ModuleB для выполнения реальной задачи). Они общаются друг с другом через веб-службы. Теперь я хочу, чтобы веб-служба ModuleA вызывала прокси ModuleB для выполнения конкретной задачи.Как сопоставить 2 разных объекта вместе

В моем веб-службы ModuleA У меня есть метод, чтобы создать запись:

public void createStudent(ModuleA.Student student){ 
    // Here will call ModuleB proxy to do the actual task which is create. 

    *moduleBFacade().createStudent( );* 
} 

В моей ModuleB Proxy:

public void createStudent(ModuleB.Student student){} 

Итак, теперь проблема, я не могу передать объект ModuleA в метод createStudent, поскольку в качестве аргументов он принимает только объекты moduleB.

Любая идея, как решить эту проблему? Пожалуйста, дайте мне несколько предложений.

+1

Слишком много дополнительных ограничений добавили через комментарии ... это домашнее задание? – Nate

ответ

0

Циркулярная зависимость == Плохой дизайн.

Редизайн модулей для удаления круговой зависимости.

+0

Извините, у меня ничего нет. Почему вы не можете перепроектировать? Если это не работает, что делает ваш текущий код для вас? – duffymo

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

В приведенном выше примере предполагается, что все поля являются частными. Если это не так, то то же самое можно сделать с помощью методов (имена модулей отображения модуля для имен геттеров).

+0

Сколько из этих похожих классов у вас есть? ^^ – akuhn

+0

привет Адриан спасибо, я попробовал ваш метод отразить объект без ошибок, но он не возвращает мне значения, значение studentAont не будет отражать для studentB? – user236501

+0

Я не понимаю, вы можете перефразировать свой вопрос? Предполагается, что метод 'convert' должен скопировать все атрибуты из A в B, чтобы вернуть значения из B в A, вы должны снова вызвать« конвертировать »в другой путь. – akuhn

1

Как вы можете использовать WS, вы можете преобразовать модульA.Student в xml, а затем изменить пространство имен xml и затем создать экземпляр объекта moduleB.Student из xml.

Что-то вроде:

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, будут использовать некоторую структуру привязки для сортировки объекта в xml на основе wsdl. Структура привязки обеспечивает реализацию toXml(), а также вспомогательных классов, таких как StudentDocument, во время компиляции wsdl. – BSingh

+0

Я использую JAXB для привязки к java для xml – user236501

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
Так как ваш объект является одним и тем же в двух пакетах, и вы делаете веб-сервис, я бы предложил это Simple framework, да, его называемый Simple на самом деле. Простой помогает вам сериализовать свой объект в XML и десериализовать его обратно, довольно просто.

0

Вы можете использовать BeanUtils.copyProperties для копирования подобной фасоли (примечания, это мелкая копия)

Смежные вопросы