2015-03-16 4 views
6

Я хочу использовать аннотацию @ServiceActivator по методу интерфейса по умолчанию Java 8. Этот метод по умолчанию будет делегировать другой метод этого интерфейса в зависимости от бизнес-правил.Spring Integration @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 аннотацию от метода по умолчанию, и переопределить этот метод по умолчанию в моем @Service классе и делегировать супер метод:

@Service 
public class MyWorkingService implements MyServiceInterface { 

    @ServiceActivator 
    @Override 
    public void onMessageReceived(MyPayload payload) { 
     MyServiceInterface.super.onMessageReceived(payload); 
    } 

    public void myMethod(...) { 
     ... 
    } 
} 

Переопределение метода по умолчанию пренебрегает назначение метода по умолчанию.

Есть ли другой способ реализовать этот сценарий в чистом виде?

ответ

2

Это сейчас не работает, потому что Spring Integration опирается на ReflectionUtils.doWithMethods, который использует ReflectionUtils.getDeclaredMethods и последний раз делает это clazz.getDeclaredMethods(), который не возвращает эти default метод интерфейса.

Не стесняйтесь поднять вопрос JIRA против Spring Framework, чтобы рассмотреть этот вариант.

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

+0

Поднял вопрос JIRA https://jira.spring.io/browse/INT-3676 –

+1

Как я уже сказал, это проблема с SF, поэтому перешел в соответствующий проект: https://jira.spring.io/ просмотр/SPR-12822 –

+0

Последующие действия: он был установлен весной 4.2 RC1 –

Смежные вопросы