2012-06-25 2 views
1

У меня есть куча сгенерированных заглушек SOAP-клиентов, которые отличаются версиями WSDL. Это происходит потому, что серверы SOAP имеют разную версию своих веб-сервисов.Управление несколькими версиями SOAP-заглушек

Штыри для веб-службы версии 1 упакованы в soap.stubs.version1 и заглушки для версии 2 под soap.stubs.version2.

Это означает, что MyStub в версии 1 WSDL может отличаться от MyStub в версии 2. Как таковой, если я вызову метод SOAP, который возвращает версию 2 MyStub и удерживает значение в версии 1 MyStub, он «сломает» », так как XML-ответ не может быть правильно отображен на атрибуты заглушки.

Из-за этого мне нужно связать типы классов с SOAP-серверами.

Репликация логики для каждой версии будет просто невозможно:

if(SoapServer.version==1) 
{ 
    soap.subts.version1.MyStub result = SoapServer.getFoo(); 
    /* rest of the logic using result of type soap.subts.version1.MyStub */ 
} 
else if(SoapServer.version==2) 
{ 
    soap.subts.version2.MyStub result = SoapServer.getFoo(); 
    /* rest of the logic using result of type soap.subts.version2.MyStub */ 
} 

Каждый раз, когда я генерировать заглушек для новой версии мне нужно будет повторить всю логику, чтобы использовать новые корешки. Иногда единственным изменением является атрибут.

Как я могу использовать соответствующие заглушки в зависимости от сервера SOAP без необходимости повторной реализации всей логики для этого «класса»?

Я думал об использовании Object, но для этого требовалось бы выделить if instanceof и casts.

ответ

0

Мне удалось решить эту проблему с ошибкой отражения Java и URLClassLoader. То, что я поясню сделал:

  • В зависимости от версии сервера я определить имя пакета, из которого для извлечения subts
  • Использование URLClassLoader я загрузить правильные файлы .class
  • С помощью отражения Я призываю правильные методы

Это имеет большое преимущество Plug And Play SOAP Servers даже с различными версиями заглушек. Единственное, что должно быть постоянным между версиями, это имена методов, поэтому их можно получить через Class.getMethod.