6

@ServiceActivatorJava 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(...) {
        ...
    }
}

デフォルト メソッドをオーバーライドすると、デフォルト メソッドの目的が無視されます。

このシナリオをクリーンな方法で実装する別の方法はありますか?

4

1 に答える 1