[ 
https://issues.apache.org/jira/browse/CAMEL-25940?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on CAMEL-25940 started by Claus Ibsen.
-------------------------------------------
> camel-jsonpath - a NullPointerException when resultType is java.util.Map and 
> the path gives one value that is not a map
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25940
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25940
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-jsonpath
>            Reporter: Claus Ibsen
>            Assignee: Claus Ibsen
>            Priority: Minor
>             Fix For: 4.24.0
>
>
> A jsonpath expression whose path gives a list of values that are not maps, 
> with {{resultType}} set to {{java.util.Map}}, fails with a 
> {{NullPointerException}} instead of a conversion result or a clear error.
> *Reproduce*
> Body:
> {code}
> [{"sku":"X","qty":42},{"sku":"Y","qty":0}]
> {code}
> Expression {{$[?(@.sku == 'X')].qty}} with {{resultType: java.util.Map}}:
> {code}
> org.apache.camel.ExpressionEvaluationException: java.lang.NullPointerException
> Caused by: java.lang.NullPointerException
>     at java.util.Objects.requireNonNull(Objects.java:220)
>     at java.util.Optional.of(Optional.java:113)
>     at java.util.stream.FindOps$FindSink$OfRef.get(FindOps.java:194)
> {code}
> *Cause*
> {{JsonPathExpression.evaluate}} (camel-jsonpath) converts each element of a 
> list result to the result type. Integer to Map has no converter, so the 
> element becomes null. The list of one element is then unwrapped with 
> {{col.stream().findFirst().get()}}, and {{findFirst()}} throws an NPE when 
> the element it picks is null:
> {code:java}
> } else if (result instanceof Collection<?> col) {
>     // convert each element in the list
>     result = col.stream()
>             .filter(Objects::nonNull) // skip null
>             .map(item -> 
> exchange.getContext().getTypeConverter().convertTo(resultType, exchange, 
> item))
>             .collect(Collectors.toList());
> }
> if (result instanceof Collection<?> col && col.size() == 1) {
>     result = col.stream().findFirst().get();
> }
> {code}
> The code came with CAMEL-20508, which aligned the conversion to resultType 
> with camel-jq.
> *Expected*
> The unwrap should handle a null element, for example with 
> {{col.iterator().next()}}, so the result is null, or the conversion that 
> fails should say which element could not be converted to the result type. 
> Either way, no NPE.
> Found in the review of https://github.com/apache/camel/pull/28210: the AI 
> tools there point to {{resultType: java.util.Map}} for a filter. 
> https://github.com/apache/camel/pull/28253 stops giving that advice for a 
> path that goes on after the filter.
> _Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to