Issue
I'm trying to use a Java 8 stream and lambda expression in a Spring @Cache annotation.
I'm trying to use the following:
@CacheEvict(value = "tags", allEntries = true,
condition = "#entity.getTags().stream().anyMatch(tag -> tag.getId() == null)")
It is failing with:
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
However, I am able to get it to work if I move the stream into a method on the entity. The annotation then works as follows without error:
@CacheEvict(value = "tags", beforeInvocation=true, allEntries = true,
condition = "#entity.containsNewTag()")
I would prefer not to need the 'containtsNewTag()' method and use the stream directly in the SpEL expression if possible. Can this be done?
Solution
Spring Expression Language is defined in the developer guide. What you're trying to do isn't supported by the language at the moment. I'd also argue that this is a very weird place to put such code: an isolated method that you can unit test is much better indeed.
Answered By - Stephane Nicoll
Answer Checked By - Marie Seifert (JavaFixing Admin)