我想在 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/