Skip to content

Commit df8bb93

Browse files
committed
fix: 策略执行器中先判断类型,再判断 supports 方法
1. 防止在各策略实现中,强转到自己的 context 类报错
1 parent 2017e66 commit df8bb93

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

common/core/src/main/java/com/github/cadecode/uniboot/common/core/extension/strategy/AbstractStrategyExecutor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.cadecode.uniboot.common.core.extension.strategy;
22

33
import java.util.List;
4+
import java.util.Optional;
45

56
/**
67
* 策略执行器抽象类
@@ -10,5 +11,7 @@
1011
*/
1112
public abstract class AbstractStrategyExecutor implements StrategyExecutor {
1213

14+
public abstract <S> Optional<S> selectService(Class<S> clazz, StrategyContext context);
15+
1316
public abstract <S> List<S> selectServices(Class<S> clazz, StrategyContext context);
1417
}

common/core/src/main/java/com/github/cadecode/uniboot/common/core/extension/strategy/StrategyExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public interface StrategyExecutor {
1818

1919
<R, S extends StrategyService> R submit(Class<S> clazz, StrategyContext context, Function<S, R> function);
2020

21-
<S extends StrategyService> List<Object> submitAll(Class<S> clazz, StrategyContext context, Function<S, Object> function);
21+
<R, S extends StrategyService> List<R> submitAll(Class<S> clazz, StrategyContext context, Function<S, R> function);
2222

2323
}

common/core/src/main/java/com/github/cadecode/uniboot/common/core/extension/strategy/StrategySelectorExecutor.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.stereotype.Component;
99

1010
import java.util.List;
11+
import java.util.Optional;
1112
import java.util.function.Consumer;
1213
import java.util.function.Function;
1314
import java.util.stream.Collectors;
@@ -35,9 +36,9 @@ public class StrategySelectorExecutor extends AbstractStrategyExecutor {
3536
*/
3637
@Override
3738
public <S extends StrategyService> void execute(Class<S> clazz, StrategyContext context, Consumer<S> consumer) {
38-
List<S> services = selectServices(clazz, context);
39-
if (ObjUtil.isNotEmpty(services)) {
40-
consumer.accept(services.get(0));
39+
Optional<S> serviceOpt = selectService(clazz, context);
40+
if (serviceOpt.isPresent()) {
41+
consumer.accept(serviceOpt.get());
4142
return;
4243
}
4344
throw new ExtException("Strategy service not found");
@@ -70,9 +71,9 @@ public <S extends StrategyService> void executeAll(Class<S> clazz, StrategyConte
7071
*/
7172
@Override
7273
public <R, S extends StrategyService> R submit(Class<S> clazz, StrategyContext context, Function<S, R> function) {
73-
List<S> services = selectServices(clazz, context);
74-
if (ObjUtil.isNotEmpty(services)) {
75-
return function.apply(services.get(0));
74+
Optional<S> serviceOpt = selectService(clazz, context);
75+
if (serviceOpt.isPresent()) {
76+
return function.apply(serviceOpt.get());
7677
}
7778
throw new ExtException("Strategy service not found");
7879
}
@@ -86,7 +87,7 @@ public <R, S extends StrategyService> R submit(Class<S> clazz, StrategyContext c
8687
* @return 返回值
8788
*/
8889
@Override
89-
public <S extends StrategyService> List<Object> submitAll(Class<S> clazz, StrategyContext context, Function<S, Object> function) {
90+
public <R, S extends StrategyService> List<R> submitAll(Class<S> clazz, StrategyContext context, Function<S, R> function) {
9091
List<S> services = selectServices(clazz, context);
9192
if (ObjUtil.isNotEmpty(services)) {
9293
return services.stream()
@@ -96,12 +97,21 @@ public <S extends StrategyService> List<Object> submitAll(Class<S> clazz, Strate
9697
throw new ExtException("Strategy service not found");
9798
}
9899

100+
@SuppressWarnings("unchecked")
101+
@Override
102+
public <S> Optional<S> selectService(Class<S> clazz, StrategyContext context) {
103+
return (Optional<S>) pluginRegistry.getPlugins()
104+
.stream()
105+
.filter(o -> clazz.isAssignableFrom(o.getClass()) && o.supports(context))
106+
.findFirst();
107+
}
108+
99109
@SuppressWarnings("unchecked")
100110
@Override
101111
public <S> List<S> selectServices(Class<S> clazz, StrategyContext context) {
102-
return (List<S>) pluginRegistry.getPluginsFor(context)
112+
return (List<S>) pluginRegistry.getPlugins()
103113
.stream()
104-
.filter(o -> clazz.isAssignableFrom(o.getClass()))
114+
.filter(o -> clazz.isAssignableFrom(o.getClass()) && o.supports(context))
105115
.collect(Collectors.toList());
106116
}
107117
}

0 commit comments

Comments
 (0)