Обработка нескольких версий кода с помощью AOP Spring Boot - PullRequest
0 голосов
/ 14 апреля 2020

Мы переносим старое приложение в веб-приложение, используя 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());
    }
}

Это правильный подход? Или есть лучшие способы решения этой проблемы?

...