9

Spring @Cache アノテーションで Java 8 ストリームとラムダ式を使用しようとしています。

私は以下を使用しようとしています:

@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 はタグを参照します。

例 anyMatch:

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

例 allMatch:

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