Spring Integration @ServiceActivator на Java 8 метод интерфейса по умолчанию
Я хотел бы использовать @ServiceActivator
аннотация метода интерфейса Java 8 по умолчанию. Этот метод по умолчанию делегирует другой метод этого интерфейса в зависимости от бизнес-правил.
public interface MyServiceInterface {
@ServiceActivator
public default void onMessageReceived(MyPayload payload) {
if(payload.getAction() == MyServiceAction.MY_METHOD) {
...
myMethod(...);
}
}
public void myMethod(...);
}
этот интерфейс затем реализуется Spring @Service
класс:
@Service
public class MyService implements MyServiceInterface {
public void myMethod(...) {
...
}
}
при выполнении кода, это не работает!
Я могу только заставить его работать, чтобы удалить @ServiceActivator
аннотация из метода по умолчанию и переопределить этот метод по умолчанию в my @Service
класс и делегат к супер методу:
@Service
public class MyWorkingService implements MyServiceInterface {
@ServiceActivator
@Override
public void onMessageReceived(MyPayload payload) {
MyServiceInterface.super.onMessageReceived(payload);
}
public void myMethod(...) {
...
}
}
переопределение метода по умолчанию игнорирует назначение метода по умолчанию.
есть ли другой способ реализовать этот сценарий в чистом виде?
1 ответов
это не работает сейчас, потому что весенняя интеграция зависит от ReflectionUtils.doWithMethods
, который использует ReflectionUtils.getDeclaredMethods
и последний просто делает это clazz.getDeclaredMethods()
, который не возвращает те default
методы интерфейса.
не стесняйтесь поднять Джира вопрос против Spring Framework, чтобы рассмотреть этот вариант.
тем временем, правильно, нет другого выбора, кроме как переопределить этот метод.