Spring 在Java 8个默认接口方法上集成@ServiceActivator
Spring Integration @ServiceActivator on a Java 8 default interface method
我想在 Java 8 默认接口方法上使用 @ServiceActivator
注释。此默认方法将根据业务规则委托给此接口的另一个方法。
public interface MyServiceInterface {
@ServiceActivator
public default void onMessageReceived(MyPayload payload) {
if(payload.getAction() == MyServiceAction.MY_METHOD) {
...
myMethod(...);
}
}
public void myMethod(...);
}
这个接口然后由Spring @Service
class:
实现
@Service
public class MyService implements MyServiceInterface {
public void myMethod(...) {
...
}
}
执行代码时,这个不行!
我只能让它工作以从默认方法中删除 @ServiceActivator
注释,并在我的 @Service
class 中覆盖该默认方法并委托给超级方法:
@Service
public class MyWorkingService implements MyServiceInterface {
@ServiceActivator
@Override
public void onMessageReceived(MyPayload payload) {
MyServiceInterface.super.onMessageReceived(payload);
}
public void myMethod(...) {
...
}
}
覆盖默认方法会忽略默认方法的用途。
是否有另一种方法可以干净地实现此方案?
这现在不起作用,因为 Spring 集成依赖于 ReflectionUtils.doWithMethods
,它使用 ReflectionUtils.getDeclaredMethods
,而最后一个只是这样做 clazz.getDeclaredMethods()
,它不't return 界面上的那些 default
方法。
随时针对 Spring 框架提出 JIRA 问题以考虑该选项。
同时,对,除了重写那个方法,别无选择。
我想在 Java 8 默认接口方法上使用 @ServiceActivator
注释。此默认方法将根据业务规则委托给此接口的另一个方法。
public interface MyServiceInterface {
@ServiceActivator
public default void onMessageReceived(MyPayload payload) {
if(payload.getAction() == MyServiceAction.MY_METHOD) {
...
myMethod(...);
}
}
public void myMethod(...);
}
这个接口然后由Spring @Service
class:
@Service
public class MyService implements MyServiceInterface {
public void myMethod(...) {
...
}
}
执行代码时,这个不行!
我只能让它工作以从默认方法中删除 @ServiceActivator
注释,并在我的 @Service
class 中覆盖该默认方法并委托给超级方法:
@Service
public class MyWorkingService implements MyServiceInterface {
@ServiceActivator
@Override
public void onMessageReceived(MyPayload payload) {
MyServiceInterface.super.onMessageReceived(payload);
}
public void myMethod(...) {
...
}
}
覆盖默认方法会忽略默认方法的用途。
是否有另一种方法可以干净地实现此方案?
这现在不起作用,因为 Spring 集成依赖于 ReflectionUtils.doWithMethods
,它使用 ReflectionUtils.getDeclaredMethods
,而最后一个只是这样做 clazz.getDeclaredMethods()
,它不't return 界面上的那些 default
方法。
随时针对 Spring 框架提出 JIRA 问题以考虑该选项。
同时,对,除了重写那个方法,别无选择。