如何在Spring中将@Cacheable与方法返回类型Stream <object>一起使用?

时间:2018-07-18 11:59:15

标签: spring spring-boot spring-data-jpa java-stream

我有以下JPA方法可获取对象流

@Cacheable("accounts")
    Stream<Account> findAccounts(int branchCode, int accountCode);

由于流将在调用该方法后关闭,因此当我第二次调用该方法时出现以下错误。

java.lang.IllegalStateException: stream has already been operated upon or closed

我想做的是;缓存流的内容(即帐户),并从缓存中读取所有后续调用。 实现此目标的最佳方法是什么?

更新:请注意,我知道使用列表,但是必须保留返回类型Stream。

1 个答案:

答案 0 :(得分:4)

您不能缓存Stream。不过,您可以缓存的是任何类型的Collection(最好是List)。

为了不违反API合约,您只需提取一个返回List的私有方法,并用@Cacheable对其进行注释。然后,原始方法(不带@Cacheable注释)仅调用可缓存方法并对其调用stream(),每次调用时从Stream构造一个新的List,像这样:

Stream<Account> findAccounts(int branchCode, int accountCode) {
    return findAccountList(branchCode, accountCode).stream();
}

@Cacheable("accounts")
private List<Account> findAccountList(int branchCode, int accountCode);

但是,如果非常决定要缓存惰性评估的数据结构(我建议这样做),则可以使用jOOλSeqBuffer(不过,它是程序包私有的,所以我想您只需要复制代码即可。)

免责声明:我是SeqBuffer类的作者。