Мы переносим старое приложение в веб-приложение, используя Spring Boot.
Веб-сервер предоставляет Soap конечные точки веб-службы, которые поддерживают 13 различных версий wsdl (из V1-V14 исключает V13), и там Существуют некоторые изменения в уровне проверки кода (Controller -> Validation -> Business ..), которые зависят от версии запроса.
Обратите внимание, что уровень проверки включает в себя бизнес-логику c и взаимодействие с внешним системы.
В настоящее время мы закончили последнюю версию V14 последней бизнес-код. И теперь мы находим способ интегрировать остальные 12 версий в базу кода. Мы планируем использовать Aspect-Oriented Programming, предоставленную Spring, чтобы справиться с этим.
Существует 3 части решений:
- аннотации и аспект для обработки метода, который оформлен аннотациями
- спецификация версии c бизнес-классы
- бизнес-класс-обертка, который вызывает бизнес-классы с несколькими версиями
Сначала мы создадим несколько аннотаций, чтобы указать, к какой версии относится код.
public @interface SpecificVersion14{}
public @interface SpecificVersion12{}
А аспект создан для обработки метода, который оформлен этими аннотациями.
public ValidationAspect {
@Around("annotations(SpecificVersion14)")
public Object handleSpecificVersion14(ProceedingJoinPoint joinPoint){
if(isVersion14) {
return joinPoint.proceed();
}
return null;
}
@Around("annotations(SpecificVersion12)")
public Object handleSpecificVersion12(ProceedingJoinPoint joinPoint){
if(isVersion12) {
return joinPoint.proceed();
}
return null;
}
}
Затем примените к бизнес-коду, например, здесь у нас есть бизнес, чтобы проверить номер телефона, который указывает c по V12 и V14. Поскольку AOP использует прокси-класс, мы создаем новый компонент и аннотируем функцию validate с помощью приведенных выше аннотаций.
@Component
class ValidatePhoneNumberV14 {
@SpecificVersion14
public AlertMessages validatePhoneNumber(String phoneNumber) {}
}
@Component
class ValidatePhoneNumberV12 {
@SpecificVersion12
public AlertMessages validatePhoneNumber(String phoneNumber) {}
}
Наконец, ValidatePhoneNumber скрывает версию logi c для своих клиентов.
class ValidatePhoneNumber {
private ValidatePhoneNumberV14 validatePhoneNumberV14;
private ValidatePhoneNumberV12 validatePhoneNumberV12;
public AlertMessages validatePhoneNumber(String phoneNumber) {
validatePhoneNumberV14.validatePhoneNumber(phoneNumber); // get called if V14
validatePhoneNumberV12.validatePhoneNumber(phoneNumber); // get called if V12
}
}
(Код может быть реорганизован для остановки проверки, когда он достигает желаемой версии, но это не важно здесь, в вопросе)
Наконец, основной поток проверки использует только один проверяющий номер для телефонного номера
class ValidationContact {
private ValidatePhoneNumber validatePhoneNumber;
public AlertMessages validateContact(Contact contact) {
validatePhoneNumber.validatePhoneNumber(contact.getPhoneNumber());
}
}
Это правильный подход? Или есть лучшие способы решения этой проблемы?