9

我正在尝试在 Spring @Cache 注释中使用 Java 8 流和 lambda 表达式。

我正在尝试使用以下内容:

@CacheEvict(value = "tags", allEntries = true, 
condition = "#entity.getTags().stream().anyMatch(tag -> tag.getId() == null)")

它失败了:

SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
org.springframework.expression.spel.SpelParseException: 
EL1042E:(pos 40): Problem parsing right operand

但是,如果我将流移动到实体上的方法中,我就能让它工作。注释然后按如下方式工作而没有错误:

@CacheEvict(value = "tags", beforeInvocation=true, allEntries = true, 
condition = "#entity.containsNewTag()")

如果可能,我宁愿不需要“containtsNewTag()”方法,而是直接在 SpEL 表达式中使用流。这可以做到吗?

4

2 回答 2

8

Spring Expression Language在开发者指南中定义。目前该语言不支持您尝试执行的操作。我还认为这是放置此类代码的一个非常奇怪的地方:可以进行单元测试的隔离方法确实要好得多。

于 2015-08-21T12:31:59.240 回答
5

不要让反对者妨碍您,即使他们发表了已接受的答案!:) 你可以用一点创意来完成你的意图!以下语法(使用集合选择和'this')

这里#root 是你的实体,在选择中,#this 指的是一个标签。

任何匹配示例:

"#root.getTags().?[#this.getId() == null].size() > 0"

示例 allMatch:

"#root.getTags().?[#this.getId() == null].size() eq #root.getTags().size()"
于 2019-04-04T21:11:27.790 回答