gpt4 book ai didi

java - 防止 Spring AOP 关闭我的 Stream?

转载 作者:行者123 更新时间:2023-11-29 07:24:17 26 4
gpt4 key购买 nike

我正在使用以下结构(简化):

@Component
class RuleProvider {
public Stream<String> getRules() {
return Stream.of("r1", "r2", "r3");
}
}

@Service
class RuleService {
@Autowired RuleProvider ruleProvider;
public void evaluateRules() {
ruleProvider.getRules().foreach(System.out::println);
}
}

并且我使用 Spring AOP 来执行日志记录。现在我想记录所有交给服务的规则。一般来说,应该这样做:

@Aspect
class LoggingAspect {
@AfterReturning(value="execution(* *..RuleProvider.getRules(*))",
returning="rules")
void logRules(JoinPoint jp, Stream<String> rules) {
Logger logger = LoggerFactory.getLogger(jp.getTarget().getClass());
rules.peek(rule -> logger.debug("evaluating {}", rule);
}
}

这应该有效 - 评估方面,注册 peek 中间操作,一旦执行 foreach() 终端操作,日志记录也应该完成。

但是,当我运行它时,流似乎在方面运行后关闭 - 我在服务方法中得到“流已经被操作或关闭”。

为什么 Stream 被关闭了?有什么我可以做的吗?

最佳答案

流没有关闭,但它显然“已经被操作”,正如错误消息所说的那样。考虑一下 peek 通常是如何使用的:

Stream.of(...)
.peek(...)
.other_operations(...);

请注意,other_operations() 作用于 由 peek() 返回的流,而不作用于原始流。您对方面的操作与此类似:

Stream s = Stream.of(...);
s.peek(...);
s.other_operations(...);

解决这个问题的方法是替换返回值,例如通过使用 @Around 切面。

关于java - 防止 Spring AOP 关闭我的 Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57359212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com