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, чтобы рассмотреть этот вариант.

тем временем, правильно, нет другого выбора, кроме как переопределить этот метод.