Это еще немного неясно для меня ваш сценарий, но я предполагаю, что у вас есть два реальных класса заказа в вашем проекте. Возможно, это один из пакетов com.foo.api1, а другой - в пакете com.foo.api2. Или один заказ называется Order1, а другой называется Order2. Идея состоит в том, что я предполагаю, что у вас есть два разных класса для двух «api-версий» Order.
Вы можете добиться того, что вам нужно с помощью Spring AOP:
@Aspect
@Component
public class MyAspect {
@Autowired
private Validator1 validator1;
@Autowired
private Validator2 validator2;
@Pointcut("execution(* com.foo.bar.OrderProcessor.process(..))")
private void myPointcut() {}
@Around("myPointcut() && args(order)")
public Object myAroundAdvice(ProceedingJoinPoint pjp, Object order) throws Throwable {
if (order instanceof Order1) {
validator1.validate((Order1) order);
} else
if (order instanceof Order2) {
validator2.validate((Order2) order);
}
Object retVal = pjp.proceed();
return retVal;
}
}
@Component
public class OrderProcessor {
public void process(Object order) {
System.out.println("processing order");
}
}
@Component
public class Validator1 {
public void validate(Order1 order) {
System.out.println("validating inside validator 1");
}
}
@Component
public class Validator2 {
public void validate(Order2 order) {
System.out.println("validating inside validator 2");
}
}
Так, в принципе, вы определяете аспект, который должен перехватывать вызовы к классу OrderProcessor и, в зависимости от того, что параметр получает, он вызывает один валидатор или другой.
Какова логика, определяющая, какой валидатор использовать? (вы сказали «версия сервиса», но я не вижу «сервиса» в вашем коде) –
По версии я имею в виду api-версию. В этом примере, скажем, у нас есть две версии «Заказ». версия 2.0 имеет большее количество полей, и для нее требуется отдельный валидатор, чем версия 1.0 с меньшими полями. В нашем приложении у нас уже есть 2 валидатора, но нам нужно знать механизм, как правильно вводить правильный валидатор с использованием весны. Остальная бизнес-логика для нас одинакова, поэтому ее обрабатывает тот же OrderProcessor. – Bharimalla