Issue
Can someone tell me why this does not work:
@Test
public void should_parse_json() {
Expression expression = new SpelExpressionParser().parseExpression("#jsonPath(get('JsonData'), '$.someData')");
Map<String, Object> data = new HashMap<>();
data.put("JsonData", "{\"someData\": 100}");
StandardEvaluationContext context = new StandardEvaluationContext(data);
context.addPropertyAccessor(new JsonPropertyAccessor());
assertThat(expression.getValue(context, Object.class)).isEqualTo(100);
}
I get error "org.springframework.expression.spel.SpelEvaluationException: EL1006E: Function 'jsonPath' could not be found"
And I have following jar in classpath:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
</dependency>
The SPEL documentation did not help me.
Solution
Such a #jsonPath()
SpEL function is a part of Spring Integration infrastructure: https://docs.spring.io/spring-integration/docs/current/reference/html/spel.html#spel-functions.
It's not going to work with the plain Spring and only SpEL.
However I see that you use a JsonPropertyAccessor
. This one indeed a part of Spring Integration and you definitely have that in your classpath.
From here I think you just miss to register a SpEL function into the StandardEvaluationContext
: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#expressions-ref-functions
context.registerFunction("jsonPath", BeanUtils.resolveSignature("evaluate", JsonPathUtils.class));
Answered By - Artem Bilan
Answer Checked By - Marilyn (JavaFixing Volunteer)