为什么这个流和 lambda 表达式不能与 SpELL 声明一起使用?
Why doesn't this stream & lambda expression work with SpEL declaration?
我正在尝试在 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 表达式中使用流。这能做到吗?
Spring 定义了表达式语言 in the developer guide。目前该语言不支持您尝试执行的操作。我还认为这是放置此类代码的一个非常奇怪的地方:您可以进行单元测试的独立方法确实要好得多。
不要让反对者妨碍您,即使他们接受了答案! :) 您可以通过一点创意来实现您的意图!以下语法(使用 Collection Selection 和 'this')
此处#root 是您的实体,在选择中,#this 指的是一个标签。
任意匹配示例:
"#root.getTags().?[#this.getId() == null].size() > 0"
示例全部匹配:
"#root.getTags().?[#this.getId() == null].size() eq #root.getTags().size()"
我正在尝试在 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 表达式中使用流。这能做到吗?
Spring 定义了表达式语言 in the developer guide。目前该语言不支持您尝试执行的操作。我还认为这是放置此类代码的一个非常奇怪的地方:您可以进行单元测试的独立方法确实要好得多。
不要让反对者妨碍您,即使他们接受了答案! :) 您可以通过一点创意来实现您的意图!以下语法(使用 Collection Selection 和 'this')
此处#root 是您的实体,在选择中,#this 指的是一个标签。
任意匹配示例:
"#root.getTags().?[#this.getId() == null].size() > 0"
示例全部匹配:
"#root.getTags().?[#this.getId() == null].size() eq #root.getTags().size()"