Как отобразить 2 разных объекта вместе - PullRequest
1 голос
/ 22 декабря 2009

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

В моем веб-сервисе ModuleA у меня есть метод для создания записи:

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

    *moduleBFacade().createStudent(   );*
}

В моем прокси-модуле:

public void createStudent(ModuleB.Student student){}

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

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

Ответы [ 5 ]

1 голос
/ 22 декабря 2009

Вы не можете изменить класс объекта в 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);

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

1 голос
/ 22 декабря 2009

При вызове с помощью WS вы можете преобразовать moduleA.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 голосов
/ 31 декабря 2009

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

0 голосов
/ 22 декабря 2009

Возможно, звучит неправильно, но здесь:
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. Simple помогает вам сериализовать ваш объект в XML и десериализовать его обратно, довольно просто.

0 голосов
/ 22 декабря 2009

Круговая зависимость == плохой дизайн.

Перепроектируйте модули для удаления циклической зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...