java - Java 8 默认接口(interface)方法上的 Spring Integration @ServiceActivator

标签 java spring java-8 spring-integration default-method

我想在 Java 8 默认接口(interface)方法上使用 @ServiceActivator 注释。此默认方法将根据业务规则委托(delegate)给此接口(interface)的另一个方法。

public interface MyServiceInterface {

    @ServiceActivator
    public default void onMessageReceived(MyPayload payload) {
        if(payload.getAction() == MyServiceAction.MY_METHOD) {
            ...
            myMethod(...);
        }
    }

    public void myMethod(...);
}

此接口(interface)随后由 Spring @Service 类实现:

@Service
public class MyService implements MyServiceInterface {

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

执行代码时,这不起作用!

我只能让它工作以从默认方法中删除 @ServiceActivator 注释,并在我的 @Service 类中覆盖该默认方法并委托(delegate)给 super方法:

@Service
public class MyWorkingService implements MyServiceInterface {

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

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

覆盖默认方法忽略了默认方法的目的。

是否有另一种方法可以干净地实现这种情况?

最佳答案

现在这行不通了,因为 Spring Integration 依赖于 ReflectionUtils.doWithMethods,它使用 ReflectionUtils.getDeclaredMethods 而最后一个只是做这个 clazz .getDeclaredMethods(),它不会返回接口(interface)上的那些 default 方法。

欢迎提出 JIRA针对 Spring Framework 的问题来考虑该选项。

与此同时,对,除了重写该方法,别无选择。

关于java - Java 8 默认接口(interface)方法上的 Spring Integration @ServiceActivator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076108/

相关文章:

Java 8 使用流、flatMap 和 lambda

java - 在 FTP 服务器上创建 XML 文件,无需在本地创建物理文件

java - 两人回合制游戏 android

java - 无法编写 jooq 查询

java - Spring Security 注销问题

java - 将应用程序 TransactionManager 注入(inject) JPA EntityListener

Spring 执行器 "/actuator"端点不可用

java - 坚持使用 java8 lambda 表达式

java - 如何创建运行jsp script而不刷新的搜索按钮?

java - Java 11 中 Java 8 的 JVM 标志的替代方案