You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/09/24 09:18:49 UTC
[camel] 01/01: CAMEL-18548: camel-jsonpath - Add flag to disable list and map support
This is an automated email from the ASF dual-hosted git repository.
nfilotto pushed a commit to branch CAMEL-18548/add-flag-to-disable-list-support
in repository https://gitbox.apache.org/repos/asf/camel.git
commit ca927d241a301994aa48857959eba0740e1b0bcf
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Sat Sep 24 11:13:19 2022 +0200
CAMEL-18548: camel-jsonpath - Add flag to disable list and map support
---
components/camel-cxf/camel-cxf-rest/pom.xml | 11 +-
.../cxf/jaxrs/CxfRsConsumerWithBeanTest.java | 31 +++-
.../jaxrs/testbean/CustomerServiceResource.java | 7 +
.../org/apache/camel/jsonpath/jsonpath.json | 1 +
.../org/apache/camel/jsonpath/JsonPathEngine.java | 41 ++---
.../apache/camel/jsonpath/JsonPathExpression.java | 17 ++-
.../apache/camel/jsonpath/JsonPathLanguage.java | 18 ++-
.../camel/jsonpath/JsonPathLanguageTest.java | 166 ++++++++++++++++++++-
.../org/apache/camel/model/language/jsonpath.json | 1 +
.../camel/builder/ExpressionClauseSupport.java | 133 +++++++++++++++++
.../camel/model/language/JsonPathExpression.java | 15 ++
.../language/JsonPathExpressionReifier.java | 3 +-
.../java/org/apache/camel/xml/in/ModelParser.java | 155 +++++++++++++++++--
13 files changed, 557 insertions(+), 42 deletions(-)
diff --git a/components/camel-cxf/camel-cxf-rest/pom.xml b/components/camel-cxf/camel-cxf-rest/pom.xml
index ede12cca949..f3389e9a2b2 100644
--- a/components/camel-cxf/camel-cxf-rest/pom.xml
+++ b/components/camel-cxf/camel-cxf-rest/pom.xml
@@ -126,7 +126,16 @@
<artifactId>camel-xpath</artifactId>
<scope>test</scope>
</dependency>
-
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-jsonpath</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-jackson</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-junit5</artifactId>
diff --git a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerWithBeanTest.java b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerWithBeanTest.java
index 6a2ef98bb3e..65c85c7d182 100644
--- a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerWithBeanTest.java
+++ b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerWithBeanTest.java
@@ -19,9 +19,12 @@ package org.apache.camel.component.cxf.jaxrs;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.cxf.common.CXFTestSupport;
import org.apache.camel.component.cxf.jaxrs.testbean.ServiceUtil;
+import org.apache.camel.jsonpath.JsonPathLanguage;
+import org.apache.camel.spi.LanguageCustomizer;
import org.apache.camel.spi.Registry;
import org.apache.camel.test.junit5.CamelTestSupport;
import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
@@ -31,7 +34,7 @@ import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
-public class CxfRsConsumerWithBeanTest extends CamelTestSupport {
+class CxfRsConsumerWithBeanTest extends CamelTestSupport {
private static final String CXT = CXFTestSupport.getPort1() + "/CxfRsConsumerWithBeanTest";
private static final String CXF_RS_ENDPOINT_URI
= "cxfrs://http://localhost:" + CXT
@@ -39,10 +42,14 @@ public class CxfRsConsumerWithBeanTest extends CamelTestSupport {
private static final String CXF_RS_ENDPOINT_URI_2
= "cxfrs://http://localhost:" + CXT
+ "/rest2?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource";
+ private static final String CXF_RS_ENDPOINT_URI_3
+ = "cxfrs://http://localhost:" + CXT
+ + "/rest3?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerServiceResource";
@Override
protected void bindToRegistry(Registry registry) throws Exception {
registry.bind("service", new ServiceUtil());
+ registry.bind("jsonpath-language", LanguageCustomizer.builder(JsonPathLanguage.class).build(l -> l.setSupportPojoAsMapAndList(false)));
}
@Override
@@ -51,12 +58,26 @@ public class CxfRsConsumerWithBeanTest extends CamelTestSupport {
public void configure() {
from(CXF_RS_ENDPOINT_URI).to("bean://service?method=invoke(${body[0]}, ${body[1]})");
from(CXF_RS_ENDPOINT_URI_2).bean(ServiceUtil.class, "invoke(${body[0]}, ${body[1]})");
+ from(CXF_RS_ENDPOINT_URI_3).setBody().jsonpath("$.name");
}
};
}
@Test
- public void testPutConsumer() throws Exception {
+ void testPostConsumer() throws Exception {
+ HttpPost post = new HttpPost("http://localhost:" + CXT + "/rest3/customerservice/customer");
+ StringEntity entity = new StringEntity("{\"name\":\"John\", \"age\":30, \"car\":null}");
+ post.setEntity(entity);
+ entity.setContentType("application/json");
+ try (CloseableHttpClient httpclient = HttpClientBuilder.create().build()) {
+ HttpResponse response = httpclient.execute(post);
+ assertEquals(200, response.getStatusLine().getStatusCode());
+ assertEquals("John", EntityUtils.toString(response.getEntity()));
+ }
+ }
+
+ @Test
+ void testPutConsumer() throws Exception {
sendPutRequest("http://localhost:" + CXT + "/rest/customerservice/c20");
sendPutRequest("http://localhost:" + CXT + "/rest2/customerservice/c20");
}
@@ -66,14 +87,10 @@ public class CxfRsConsumerWithBeanTest extends CamelTestSupport {
StringEntity entity = new StringEntity("string");
entity.setContentType("text/plain");
put.setEntity(entity);
- CloseableHttpClient httpclient = HttpClientBuilder.create().build();
-
- try {
+ try (CloseableHttpClient httpclient = HttpClientBuilder.create().build()) {
HttpResponse response = httpclient.execute(put);
assertEquals(200, response.getStatusLine().getStatusCode());
assertEquals("c20string", EntityUtils.toString(response.getEntity()));
- } finally {
- httpclient.close();
}
}
}
diff --git a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java
index e36313746a1..760f7ad0696 100644
--- a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java
+++ b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/testbean/CustomerServiceResource.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.cxf.jaxrs.testbean;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
+import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -47,5 +48,11 @@ public interface CustomerServiceResource {
Object invoke(
@PathParam("id") String id,
String payload);
+
+ @Path("/customer")
+ @POST
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ Object createCustomer(String payload);
}
// END SNIPPET: example
diff --git a/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json b/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
index df4c7cc3c77..329407229df 100644
--- a/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
+++ b/components/camel-jsonpath/src/generated/resources/org/apache/camel/jsonpath/jsonpath.json
@@ -21,6 +21,7 @@
"suppressExceptions": { "kind": "attribute", "displayName": "Suppress Exceptions", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to suppress exceptions such as PathNotFoundException." },
"allowSimple": { "kind": "attribute", "displayName": "Allow Simple", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow in inlined Simple exceptions in the JSONPath expression" },
"allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy Predicate", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using the easy predicate parser to pre-parse predicates." },
+ "supportPojoAsMapAndList": { "kind": "attribute", "displayName": "Support Pojo As Map And List", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "To indicate whether a Map or List should be processed natively or the default behavior is expected (Auto converted into InputStream ). This flag has been added for backward compatibility reasons." },
"writeAsString": { "kind": "attribute", "displayName": "Write As String", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to write the output of each row\/element as a JSON String value instead of a Map\/POJO value." },
"headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
"option": { "kind": "attribute", "displayName": "Option", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional options on JSONPath. Multiple values can be separated by comma." },
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
index 7db4b17afcc..c3c4df6ec18 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathEngine.java
@@ -58,16 +58,17 @@ public class JsonPathEngine {
private final String headerName;
private final Configuration configuration;
private final boolean hasSimple;
+ private final boolean supportPojoAsMapAndList;
private JsonPathAdapter adapter;
private volatile boolean initJsonAdapter;
@Deprecated
public JsonPathEngine(String expression) {
- this(expression, false, false, true, null, null, null);
+ this(expression, false, false, true, true, null, null, null);
}
public JsonPathEngine(String expression, boolean writeAsString, boolean suppressExceptions, boolean allowSimple,
- String headerName, Option[] options, CamelContext context) {
+ boolean supportPojoAsMapAndList, String headerName, Option[] options, CamelContext context) {
this.expression = expression;
this.writeAsString = writeAsString;
this.headerName = headerName;
@@ -100,6 +101,7 @@ public class JsonPathEngine {
}
}
this.hasSimple = simpleInUse;
+ this.supportPojoAsMapAndList = supportPojoAsMapAndList;
}
private ObjectMapper findRegisteredMapper(CamelContext context) {
@@ -189,25 +191,26 @@ public class JsonPathEngine {
LOG.trace("JSonPath: {} is read as String: {}", path, json);
String str = (String) json;
return JsonPath.using(configuration).parse(str).read(path);
- } else if (json instanceof Map) {
- LOG.trace("JSonPath: {} is read as Map: {}", path, json);
- Map map = (Map) json;
- return JsonPath.using(configuration).parse(map).read(path);
- } else if (json instanceof List) {
- LOG.trace("JSonPath: {} is read as List: {}", path, json);
- List list = (List) json;
- return JsonPath.using(configuration).parse(list).read(path);
- } else {
- //try to auto convert into inputStream
- Object answer = readWithInputStream(path, exchange);
- if (answer == null) {
- // fallback and attempt an adapter which can read the message body/header
- answer = readWithAdapter(path, exchange);
- }
- if (answer != null) {
- return answer;
+ } else if (supportPojoAsMapAndList) {
+ if (json instanceof Map) {
+ LOG.trace("JSonPath: {} is read as Map: {}", path, json);
+ Map<?, ?> map = (Map<?, ?>) json;
+ return JsonPath.using(configuration).parse(map).read(path);
+ } else if (json instanceof List) {
+ LOG.trace("JSonPath: {} is read as List: {}", path, json);
+ List<?> list = (List<?>) json;
+ return JsonPath.using(configuration).parse(list).read(path);
}
}
+ //try to auto convert into inputStream
+ Object answer = readWithInputStream(path, exchange);
+ if (answer == null) {
+ // fallback and attempt an adapter which can read the message body/header
+ answer = readWithAdapter(path, exchange);
+ }
+ if (answer != null) {
+ return answer;
+ }
// is json path configured to suppress exceptions
if (configuration.getOptions().contains(SUPPRESS_EXCEPTIONS)) {
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
index c2cb7df322a..07819e87b62 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathExpression.java
@@ -42,6 +42,7 @@ public class JsonPathExpression extends ExpressionAdapter {
private boolean allowSimple = true;
private boolean allowEasyPredicate = true;
private boolean writeAsString;
+ private boolean supportPojoAsMapAndList = true;
private String headerName;
private Option[] options;
@@ -138,6 +139,18 @@ public class JsonPathExpression extends ExpressionAdapter {
this.options = options;
}
+ public boolean isSupportPojoAsMapAndList() {
+ return supportPojoAsMapAndList;
+ }
+
+ /**
+ * To indicate whether a {@code Map} or {@code List} should be processed natively or the default behavior is
+ * expected (Auto converted into {@code InputStream}). This flag has been added for backward compatibility reasons.
+ */
+ public void setSupportPojoAsMapAndList(boolean supportPojoAsMapAndList) {
+ this.supportPojoAsMapAndList = supportPojoAsMapAndList;
+ }
+
@Override
public Object evaluate(Exchange exchange) {
try {
@@ -175,7 +188,9 @@ public class JsonPathExpression extends ExpressionAdapter {
LOG.debug("Initializing {} using: {}", predicate ? "predicate" : "expression", exp);
try {
- engine = new JsonPathEngine(exp, writeAsString, suppressExceptions, allowSimple, headerName, options, context);
+ engine = new JsonPathEngine(
+ exp, writeAsString, suppressExceptions, allowSimple, supportPojoAsMapAndList, headerName,
+ options, context);
} catch (Exception e) {
throw new ExpressionIllegalSyntaxException(exp, e);
}
diff --git a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
index 5b79903c03e..7598b6a0622 100644
--- a/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
+++ b/components/camel-jsonpath/src/main/java/org/apache/camel/jsonpath/JsonPathLanguage.java
@@ -37,6 +37,7 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
private boolean suppressExceptions;
private boolean allowSimple = true;
private boolean allowEasyPredicate = true;
+ private boolean supportPojoAsMapAndList = true;
private boolean writeAsString;
private String headerName;
private Option[] options;
@@ -97,6 +98,14 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
this.options = options;
}
+ public boolean isSupportPojoAsMapAndList() {
+ return supportPojoAsMapAndList;
+ }
+
+ public void setSupportPojoAsMapAndList(boolean supportPojoAsMapAndList) {
+ this.supportPojoAsMapAndList = supportPojoAsMapAndList;
+ }
+
@Override
public Predicate createPredicate(String expression) {
JsonPathExpression answer = (JsonPathExpression) createExpression(expression);
@@ -113,8 +122,8 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
answer.setAllowEasyPredicate(allowEasyPredicate);
answer.setHeaderName(headerName);
answer.setWriteAsString(writeAsString);
- answer.setHeaderName(headerName);
answer.setOptions(options);
+ answer.setSupportPojoAsMapAndList(supportPojoAsMapAndList);
answer.init(getCamelContext());
return answer;
}
@@ -141,8 +150,9 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
for (String s : option.split(",")) {
list.add(getCamelContext().getTypeConverter().convertTo(Option.class, s));
}
- answer.setOptions(list.toArray(new Option[list.size()]));
+ answer.setOptions(list.toArray(new Option[0]));
}
+ answer.setSupportPojoAsMapAndList(property(boolean.class, properties, 7, supportPojoAsMapAndList));
answer.init(getCamelContext());
return answer;
}
@@ -192,6 +202,10 @@ public class JsonPathLanguage extends LanguageSupport implements PropertyConfigu
case "writeAsString":
setWriteAsString(PropertyConfigurerSupport.property(camelContext, boolean.class, value));
return true;
+ case "supportpojoasmapandlist":
+ case "supportPojoAsMapAndList":
+ setSupportPojoAsMapAndList(PropertyConfigurerSupport.property(camelContext, boolean.class, value));
+ return true;
case "options":
setOptions(PropertyConfigurerSupport.property(camelContext, Option[].class, value));
return true;
diff --git a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathLanguageTest.java b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathLanguageTest.java
index 8b9f068f64f..8159f72e7fb 100644
--- a/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathLanguageTest.java
+++ b/components/camel-jsonpath/src/test/java/org/apache/camel/jsonpath/JsonPathLanguageTest.java
@@ -16,7 +16,11 @@
*/
package org.apache.camel.jsonpath;
+import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -25,8 +29,11 @@ import com.jayway.jsonpath.Option;
import org.apache.camel.Exchange;
import org.apache.camel.Expression;
import org.apache.camel.Predicate;
+import org.apache.camel.component.file.GenericFile;
+import org.apache.camel.converter.stream.ByteArrayInputStreamCache;
import org.apache.camel.spi.Language;
import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.support.SimpleTypeConverter;
import org.apache.camel.test.junit5.CamelTestSupport;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
@@ -87,9 +94,93 @@ public class JsonPathLanguageTest extends CamelTestSupport {
}
@Test
- public void testExpressionPojo() {
+ public void testExpressionInputStream() {
Exchange exchange = new DefaultExchange(context);
- Map pojo = new HashMap();
+ exchange.getIn().setBody(
+ new ByteArrayInputStreamCache(
+ new ByteArrayInputStream(
+ "{\"kind\": \"full\", \"type\": \"customer\"}".getBytes(StandardCharsets.UTF_8))));
+
+ Language lan = context.resolveLanguage("jsonpath");
+ Expression exp = lan.createExpression("$.kind");
+ String kind = exp.evaluate(exchange, String.class);
+
+ assertNotNull(kind);
+ assertEquals("full", kind);
+
+ exp = lan.createExpression("$.type");
+ String type = exp.evaluate(exchange, String.class);
+ assertNotNull(type);
+ assertEquals("customer", type);
+ }
+
+ @Test
+ public void testExpressionInputStreamWithEncoding() {
+ Exchange exchange = new DefaultExchange(context);
+ exchange.getIn().setBody(
+ new ByteArrayInputStreamCache(
+ new ByteArrayInputStream(
+ "{\"kind\": \"full\", \"type\": \"customer\"}".getBytes(StandardCharsets.UTF_8))));
+ exchange.getIn().setHeader(JsonPathConstants.HEADER_JSON_ENCODING, "UTF-8");
+
+ Language lan = context.resolveLanguage("jsonpath");
+ Expression exp = lan.createExpression("$.kind");
+ String kind = exp.evaluate(exchange, String.class);
+
+ assertNotNull(kind);
+ assertEquals("full", kind);
+
+ exp = lan.createExpression("$.type");
+ String type = exp.evaluate(exchange, String.class);
+ assertNotNull(type);
+ assertEquals("customer", type);
+ }
+
+ @Test
+ public void testExpressionGenericFile() {
+ Exchange exchange = new DefaultExchange(context);
+ GenericFile<File> body = new GenericFile<>();
+ body.setFile(new File("src/test/resources/type.json"));
+ exchange.getIn().setBody(body);
+
+ Language lan = context.resolveLanguage("jsonpath");
+ Expression exp = lan.createExpression("$.kind");
+ String kind = exp.evaluate(exchange, String.class);
+
+ assertNotNull(kind);
+ assertEquals("full", kind);
+
+ exp = lan.createExpression("$.type");
+ String type = exp.evaluate(exchange, String.class);
+ assertNotNull(type);
+ assertEquals("customer", type);
+ }
+
+ @Test
+ public void testExpressionGenericFileWithCharset() {
+ Exchange exchange = new DefaultExchange(context);
+ GenericFile<File> body = new GenericFile<>();
+ body.setCharset("UTF-8");
+ body.setFile(new File("src/test/resources/type.json"));
+ exchange.getIn().setBody(body);
+
+ Language lan = context.resolveLanguage("jsonpath");
+ Expression exp = lan.createExpression("$.kind");
+ String kind = exp.evaluate(exchange, String.class);
+
+ assertNotNull(kind);
+ assertEquals("full", kind);
+
+ exp = lan.createExpression("$.type");
+ String type = exp.evaluate(exchange, String.class);
+ assertNotNull(type);
+ assertEquals("customer", type);
+ }
+
+ @Test
+ public void testExpressionMap() {
+ Exchange exchange = new DefaultExchange(context);
+ Map<String, String> pojo = new HashMap<>();
pojo.put("kind", "full");
pojo.put("type", "customer");
exchange.getIn().setBody(pojo);
@@ -107,6 +198,72 @@ public class JsonPathLanguageTest extends CamelTestSupport {
assertEquals("customer", type);
}
+ @Test
+ public void testExpressionListOfMap() {
+ Exchange exchange = new DefaultExchange(context);
+ Map<String, String> pojo = new HashMap<>();
+ pojo.put("kind", "full");
+ pojo.put("type", "customer");
+ exchange.getIn().setBody(List.of(pojo));
+
+ Language lan = context.resolveLanguage("jsonpath");
+ Expression exp = lan.createExpression("$..kind");
+ List<?> kinds = exp.evaluate(exchange, List.class);
+
+ assertNotNull(kinds);
+ assertEquals(1, kinds.size());
+ assertEquals("full", kinds.get(0));
+
+ exp = lan.createExpression("$..type");
+ List<?> types = exp.evaluate(exchange, List.class);
+ assertNotNull(types);
+ assertEquals(1, types.size());
+ assertEquals("customer", types.get(0));
+ }
+
+ @Test
+ public void testExpressionListOfCustomList() {
+ context.getTypeConverterRegistry().addTypeConverter(
+ InputStream.class, CustomList.class,
+ new SimpleTypeConverter(
+ false,
+ (Class<?> type, Exchange exchange, Object value) -> new ByteArrayInputStream(
+ ((String) (((List<?>) value).get(0))).getBytes(StandardCharsets.UTF_8))));
+ Exchange exchange = new DefaultExchange(context);
+ exchange.getIn().setBody(new CustomList("{\"kind\": \"full\", \"type\": \"customer\"}"));
+
+ JsonPathLanguage lan = (JsonPathLanguage) context.resolveLanguage("jsonpath");
+ lan.setSupportPojoAsMapAndList(false);
+ Expression exp = lan.createExpression("$.kind");
+ String kind = exp.evaluate(exchange, String.class);
+
+ assertNotNull(kind);
+ assertEquals("full", kind);
+
+ exp = lan.createExpression("$.type");
+ String type = exp.evaluate(exchange, String.class);
+ assertNotNull(type);
+ assertEquals("customer", type);
+ }
+
+ @Test
+ public void testExpressionString() {
+ Exchange exchange = new DefaultExchange(context);
+ exchange.getIn().setBody("{\"kind\": \"full\", \"type\": \"customer\"}");
+
+ Language lan = context.resolveLanguage("jsonpath");
+ Expression exp = lan.createExpression("$.kind");
+ String kind = exp.evaluate(exchange, String.class);
+
+ assertNotNull(kind);
+ assertEquals("full", kind);
+
+ exp = lan.createExpression("$.type");
+ String type = exp.evaluate(exchange, String.class);
+ assertNotNull(type);
+ assertEquals("customer", type);
+ }
+
@Test
public void testPredicate() {
// Test books.json file
@@ -137,4 +294,9 @@ public class JsonPathLanguageTest extends CamelTestSupport {
assertNull(nofoo);
}
+ public static class CustomList extends ArrayList<String> {
+ public CustomList(String value) {
+ add(value);
+ }
+ }
}
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
index 108923ff497..66120cea597 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/language/jsonpath.json
@@ -18,6 +18,7 @@
"suppressExceptions": { "kind": "attribute", "displayName": "Suppress Exceptions", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to suppress exceptions such as PathNotFoundException." },
"allowSimple": { "kind": "attribute", "displayName": "Allow Simple", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow in inlined Simple exceptions in the JSONPath expression" },
"allowEasyPredicate": { "kind": "attribute", "displayName": "Allow Easy Predicate", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to allow using the easy predicate parser to pre-parse predicates." },
+ "supportPojoAsMapAndList": { "kind": "attribute", "displayName": "Support Pojo As Map And List", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "To indicate whether a Map or List should be processed natively or the default behavior is expected (Auto converted into InputStream ). This flag has been added for backward compatibility reasons." },
"writeAsString": { "kind": "attribute", "displayName": "Write As String", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to write the output of each row\/element as a JSON String value instead of a Map\/POJO value." },
"headerName": { "kind": "attribute", "displayName": "Header Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of header to use as input, instead of the message body" },
"option": { "kind": "attribute", "displayName": "Option", "label": "advanced", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "DEFAULT_PATH_LEAF_TO_NULL", "ALWAYS_RETURN_LIST", "AS_PATH_LIST", "SUPPRESS_EXCEPTIONS", "REQUIRE_PROPERTIES" ], "deprecated": false, "autowired": false, "secret": false, "description": "To configure additional options on JSONPath. Multiple values can be separated by comma." },
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
index df03eed5add..b584d15a08d 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ExpressionClauseSupport.java
@@ -506,6 +506,24 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
return expression(expression);
}
+ /**
+ * Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a>
+ *
+ * @param text the expression to be evaluated
+ * @param suppressExceptions whether to suppress exceptions such as PathNotFoundException
+ * @param allowSimple whether to allow in inlined simple exceptions in the json path expression
+ * @param supportPojoAsMapAndList whether a {@code Map} or {@code List} should be processed natively or the default
+ * behavior is expected (Auto converted into {@code InputStream})
+ * @return the builder to continue processing the DSL
+ */
+ public T jsonpath(String text, boolean suppressExceptions, boolean allowSimple, boolean supportPojoAsMapAndList) {
+ JsonPathExpression expression = new JsonPathExpression(text);
+ expression.setSuppressExceptions(Boolean.toString(suppressExceptions));
+ expression.setAllowSimple(Boolean.toString(allowSimple));
+ expression.setSupportPojoAsMapAndList(Boolean.toString(supportPojoAsMapAndList));
+ return expression(expression);
+ }
+
/**
* Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a>
*
@@ -554,6 +572,29 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
return result;
}
+ /**
+ * Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a>
+ *
+ * @param text the expression to be evaluated
+ * @param suppressExceptions whether to suppress exceptions such as PathNotFoundException
+ * @param allowSimple whether to allow in inlined simple exceptions in the json path expression
+ * @param supportPojoAsMapAndList whether a {@code Map} or {@code List} should be processed natively or the default
+ * behavior is expected (Auto converted into {@code InputStream})
+ * @param resultType the return type expected by the expression
+ * @return the builder to continue processing the DSL
+ */
+ public T jsonpath(
+ String text, boolean suppressExceptions, boolean allowSimple, boolean supportPojoAsMapAndList,
+ Class<?> resultType) {
+ JsonPathExpression expression = new JsonPathExpression(text);
+ expression.setSuppressExceptions(Boolean.toString(suppressExceptions));
+ expression.setAllowSimple(Boolean.toString(allowSimple));
+ expression.setSupportPojoAsMapAndList(Boolean.toString(supportPojoAsMapAndList));
+ expression.setResultType(resultType);
+ expression(expression);
+ return result;
+ }
+
/**
* Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a>
*
@@ -574,6 +615,31 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
return result;
}
+ /**
+ * Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a>
+ *
+ * @param text the expression to be evaluated
+ * @param suppressExceptions whether to suppress exceptions such as PathNotFoundException
+ * @param allowSimple whether to allow in inlined simple exceptions in the json path expression
+ * @param supportPojoAsMapAndList whether a {@code Map} or {@code List} should be processed natively or the default
+ * behavior is expected (Auto converted into {@code InputStream})
+ * @param resultType the return type expected by the expression
+ * @param headerName the name of the header to apply the expression to
+ * @return the builder to continue processing the DSL
+ */
+ public T jsonpath(
+ String text, boolean suppressExceptions, boolean allowSimple, boolean supportPojoAsMapAndList, Class<?> resultType,
+ String headerName) {
+ JsonPathExpression expression = new JsonPathExpression(text);
+ expression.setSuppressExceptions(Boolean.toString(suppressExceptions));
+ expression.setAllowSimple(Boolean.toString(allowSimple));
+ expression.setSupportPojoAsMapAndList(Boolean.toString(supportPojoAsMapAndList));
+ expression.setResultType(resultType);
+ expression.setHeaderName(headerName);
+ expression(expression);
+ return result;
+ }
+
/**
* Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a> with writeAsString enabled.
*
@@ -641,6 +707,26 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
return expression(expression);
}
+ /**
+ * Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a> with writeAsString enabled.
+ *
+ * @param text the expression to be evaluated
+ * @param suppressExceptions whether to suppress exceptions such as PathNotFoundException
+ * @param allowSimple whether to allow in inlined simple exceptions in the json path expression
+ * @param supportPojoAsMapAndList whether a {@code Map} or {@code List} should be processed natively or the default
+ * behavior is expected (Auto converted into {@code InputStream})
+ * @return the builder to continue processing the DSL
+ */
+ public T jsonpathWriteAsString(
+ String text, boolean suppressExceptions, boolean allowSimple, boolean supportPojoAsMapAndList) {
+ JsonPathExpression expression = new JsonPathExpression(text);
+ expression.setWriteAsString(Boolean.toString(true));
+ expression.setSuppressExceptions(Boolean.toString(suppressExceptions));
+ expression.setAllowSimple(Boolean.toString(allowSimple));
+ expression.setSupportPojoAsMapAndList(Boolean.toString(supportPojoAsMapAndList));
+ return expression(expression);
+ }
+
/**
* Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a> with writeAsString enabled.
*
@@ -659,6 +745,28 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
return expression(expression);
}
+ /**
+ * Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a> with writeAsString enabled.
+ *
+ * @param text the expression to be evaluated
+ * @param suppressExceptions whether to suppress exceptions such as PathNotFoundException
+ * @param allowSimple whether to allow in inlined simple exceptions in the json path expression
+ * @param supportPojoAsMapAndList whether a {@code Map} or {@code List} should be processed natively or the default
+ * behavior is expected (Auto converted into {@code InputStream})
+ * @param headerName the name of the header to apply the expression to
+ * @return the builder to continue processing the DSL
+ */
+ public T jsonpathWriteAsString(
+ String text, boolean suppressExceptions, boolean allowSimple, boolean supportPojoAsMapAndList, String headerName) {
+ JsonPathExpression expression = new JsonPathExpression(text);
+ expression.setWriteAsString(Boolean.toString(true));
+ expression.setSuppressExceptions(Boolean.toString(suppressExceptions));
+ expression.setAllowSimple(Boolean.toString(allowSimple));
+ expression.setSupportPojoAsMapAndList(Boolean.toString(supportPojoAsMapAndList));
+ expression.setHeaderName(headerName);
+ return expression(expression);
+ }
+
/**
* Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a> with writeAsString enabled.
*
@@ -680,6 +788,31 @@ public class ExpressionClauseSupport<T> implements ExpressionFactoryAware, Predi
return expression(expression);
}
+ /**
+ * Evaluates a <a href="http://camel.apache.org/jsonpath.html">Json Path expression</a> with writeAsString enabled.
+ *
+ * @param text the expression to be evaluated
+ * @param suppressExceptions whether to suppress exceptions such as PathNotFoundException
+ * @param allowSimple whether to allow in inlined simple exceptions in the json path expression
+ * @param supportPojoAsMapAndList whether a {@code Map} or {@code List} should be processed natively or the default
+ * behavior is expected (Auto converted into {@code InputStream})
+ * @param headerName the name of the header to apply the expression to
+ * @param resultType the return type expected by the expression
+ * @return the builder to continue processing the DSL
+ */
+ public T jsonpathWriteAsString(
+ String text, boolean suppressExceptions, boolean allowSimple, boolean supportPojoAsMapAndList, String headerName,
+ Class<?> resultType) {
+ JsonPathExpression expression = new JsonPathExpression(text);
+ expression.setWriteAsString(Boolean.toString(true));
+ expression.setSuppressExceptions(Boolean.toString(suppressExceptions));
+ expression.setAllowSimple(Boolean.toString(allowSimple));
+ expression.setSupportPojoAsMapAndList(Boolean.toString(supportPojoAsMapAndList));
+ expression.setHeaderName(headerName);
+ expression.setResultType(resultType);
+ return expression(expression);
+ }
+
/**
* Evaluates an <a href="http://camel.apache.org/ognl.html">OGNL expression</a>
*
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
index bae9b501d86..70004494c6f 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/language/JsonPathExpression.java
@@ -46,6 +46,9 @@ public class JsonPathExpression extends ExpressionDefinition {
@Metadata(label = "advanced", defaultValue = "true", javaType = "java.lang.Boolean")
private String allowEasyPredicate;
@XmlAttribute
+ @Metadata(label = "advanced", defaultValue = "true", javaType = "java.lang.Boolean")
+ private String supportPojoAsMapAndList;
+ @XmlAttribute
@Metadata(defaultValue = "false", javaType = "java.lang.Boolean")
private String writeAsString;
@XmlAttribute
@@ -151,6 +154,18 @@ public class JsonPathExpression extends ExpressionDefinition {
this.option = option;
}
+ public String getSupportPojoAsMapAndList() {
+ return supportPojoAsMapAndList;
+ }
+
+ /**
+ * To indicate whether a {@code Map} or {@code List} should be processed natively or the default behavior is
+ * expected (Auto converted into {@code InputStream}). This flag has been added for backward compatibility reasons.
+ */
+ public void setSupportPojoAsMapAndList(String supportPojoAsMapAndList) {
+ this.supportPojoAsMapAndList = supportPojoAsMapAndList;
+ }
+
@Override
public String getLanguage() {
return "jsonpath";
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
index 5ef7d1eaec5..b546e40e2df 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/language/JsonPathExpressionReifier.java
@@ -43,7 +43,7 @@ public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpress
}
private Object[] createProperties() {
- Object[] properties = new Object[7];
+ Object[] properties = new Object[8];
properties[0] = definition.getResultType();
properties[1] = parseBoolean(definition.getSuppressExceptions());
properties[2] = parseBoolean(definition.getAllowSimple());
@@ -51,6 +51,7 @@ public class JsonPathExpressionReifier extends ExpressionReifier<JsonPathExpress
properties[4] = parseBoolean(definition.getWriteAsString());
properties[5] = parseString(definition.getHeaderName());
properties[6] = parseString(definition.getOption());
+ properties[7] = parseBoolean(definition.getSupportPojoAsMapAndList());
return properties;
}
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index d0db623bb8e..7bdf1933ff7 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -29,18 +29,154 @@ import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
+
import org.apache.camel.model.*;
-import org.apache.camel.model.cloud.*;
+import org.apache.camel.model.cloud.BlacklistServiceCallServiceFilterConfiguration;
+import org.apache.camel.model.cloud.CachingServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.CombinedServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.CombinedServiceCallServiceFilterConfiguration;
+import org.apache.camel.model.cloud.ConsulServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.CustomServiceCallServiceFilterConfiguration;
+import org.apache.camel.model.cloud.DefaultServiceCallServiceLoadBalancerConfiguration;
+import org.apache.camel.model.cloud.DnsServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.HealthyServiceCallServiceFilterConfiguration;
+import org.apache.camel.model.cloud.KubernetesServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.PassThroughServiceCallServiceFilterConfiguration;
+import org.apache.camel.model.cloud.ServiceCallConfiguration;
+import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
+import org.apache.camel.model.cloud.ServiceCallDefinition;
+import org.apache.camel.model.cloud.ServiceCallExpressionConfiguration;
+import org.apache.camel.model.cloud.ServiceCallServiceChooserConfiguration;
+import org.apache.camel.model.cloud.ServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.ServiceCallServiceFilterConfiguration;
+import org.apache.camel.model.cloud.ServiceCallServiceLoadBalancerConfiguration;
+import org.apache.camel.model.cloud.StaticServiceCallServiceDiscoveryConfiguration;
+import org.apache.camel.model.cloud.ZooKeeperServiceCallServiceDiscoveryConfiguration;
import org.apache.camel.model.config.BatchResequencerConfig;
-import org.apache.camel.model.config.ResequencerConfig;
import org.apache.camel.model.config.StreamResequencerConfig;
-import org.apache.camel.model.dataformat.*;
-import org.apache.camel.model.errorhandler.*;
-import org.apache.camel.model.language.*;
-import org.apache.camel.model.loadbalancer.*;
-import org.apache.camel.model.rest.*;
-import org.apache.camel.model.transformer.*;
-import org.apache.camel.model.validator.*;
+import org.apache.camel.model.dataformat.ASN1DataFormat;
+import org.apache.camel.model.dataformat.Any23DataFormat;
+import org.apache.camel.model.dataformat.AvroDataFormat;
+import org.apache.camel.model.dataformat.AvroLibrary;
+import org.apache.camel.model.dataformat.BarcodeDataFormat;
+import org.apache.camel.model.dataformat.Base64DataFormat;
+import org.apache.camel.model.dataformat.BindyDataFormat;
+import org.apache.camel.model.dataformat.CBORDataFormat;
+import org.apache.camel.model.dataformat.CryptoDataFormat;
+import org.apache.camel.model.dataformat.CsvDataFormat;
+import org.apache.camel.model.dataformat.CustomDataFormat;
+import org.apache.camel.model.dataformat.DataFormatsDefinition;
+import org.apache.camel.model.dataformat.FhirDataformat;
+import org.apache.camel.model.dataformat.FhirJsonDataFormat;
+import org.apache.camel.model.dataformat.FhirXmlDataFormat;
+import org.apache.camel.model.dataformat.FlatpackDataFormat;
+import org.apache.camel.model.dataformat.GrokDataFormat;
+import org.apache.camel.model.dataformat.GzipDeflaterDataFormat;
+import org.apache.camel.model.dataformat.HL7DataFormat;
+import org.apache.camel.model.dataformat.IcalDataFormat;
+import org.apache.camel.model.dataformat.JacksonXMLDataFormat;
+import org.apache.camel.model.dataformat.JaxbDataFormat;
+import org.apache.camel.model.dataformat.JsonApiDataFormat;
+import org.apache.camel.model.dataformat.JsonDataFormat;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.model.dataformat.LZFDataFormat;
+import org.apache.camel.model.dataformat.MimeMultipartDataFormat;
+import org.apache.camel.model.dataformat.PGPDataFormat;
+import org.apache.camel.model.dataformat.ProtobufDataFormat;
+import org.apache.camel.model.dataformat.ProtobufLibrary;
+import org.apache.camel.model.dataformat.RssDataFormat;
+import org.apache.camel.model.dataformat.SoapDataFormat;
+import org.apache.camel.model.dataformat.SyslogDataFormat;
+import org.apache.camel.model.dataformat.TarFileDataFormat;
+import org.apache.camel.model.dataformat.ThriftDataFormat;
+import org.apache.camel.model.dataformat.TidyMarkupDataFormat;
+import org.apache.camel.model.dataformat.UniVocityAbstractDataFormat;
+import org.apache.camel.model.dataformat.UniVocityCsvDataFormat;
+import org.apache.camel.model.dataformat.UniVocityFixedDataFormat;
+import org.apache.camel.model.dataformat.UniVocityHeader;
+import org.apache.camel.model.dataformat.UniVocityTsvDataFormat;
+import org.apache.camel.model.dataformat.XMLSecurityDataFormat;
+import org.apache.camel.model.dataformat.XStreamDataFormat;
+import org.apache.camel.model.dataformat.YAMLDataFormat;
+import org.apache.camel.model.dataformat.YAMLLibrary;
+import org.apache.camel.model.dataformat.YAMLTypeFilterDefinition;
+import org.apache.camel.model.dataformat.ZipDeflaterDataFormat;
+import org.apache.camel.model.dataformat.ZipFileDataFormat;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
+import org.apache.camel.model.language.CSimpleExpression;
+import org.apache.camel.model.language.ConstantExpression;
+import org.apache.camel.model.language.DatasonnetExpression;
+import org.apache.camel.model.language.ExchangePropertyExpression;
+import org.apache.camel.model.language.ExpressionDefinition;
+import org.apache.camel.model.language.GroovyExpression;
+import org.apache.camel.model.language.HeaderExpression;
+import org.apache.camel.model.language.Hl7TerserExpression;
+import org.apache.camel.model.language.JoorExpression;
+import org.apache.camel.model.language.JqExpression;
+import org.apache.camel.model.language.JsonPathExpression;
+import org.apache.camel.model.language.LanguageExpression;
+import org.apache.camel.model.language.MethodCallExpression;
+import org.apache.camel.model.language.MvelExpression;
+import org.apache.camel.model.language.NamespaceAwareExpression;
+import org.apache.camel.model.language.OgnlExpression;
+import org.apache.camel.model.language.RefExpression;
+import org.apache.camel.model.language.SimpleExpression;
+import org.apache.camel.model.language.SpELExpression;
+import org.apache.camel.model.language.TokenizerExpression;
+import org.apache.camel.model.language.XMLTokenizerExpression;
+import org.apache.camel.model.language.XPathExpression;
+import org.apache.camel.model.language.XQueryExpression;
+import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.FailoverLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.RandomLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.RoundRobinLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.TopicLoadBalancerDefinition;
+import org.apache.camel.model.loadbalancer.WeightedLoadBalancerDefinition;
+import org.apache.camel.model.rest.ApiKeyDefinition;
+import org.apache.camel.model.rest.BasicAuthDefinition;
+import org.apache.camel.model.rest.BearerTokenDefinition;
+import org.apache.camel.model.rest.CollectionFormat;
+import org.apache.camel.model.rest.DeleteDefinition;
+import org.apache.camel.model.rest.GetDefinition;
+import org.apache.camel.model.rest.HeadDefinition;
+import org.apache.camel.model.rest.MutualTLSDefinition;
+import org.apache.camel.model.rest.OAuth2Definition;
+import org.apache.camel.model.rest.OpenIdConnectDefinition;
+import org.apache.camel.model.rest.ParamDefinition;
+import org.apache.camel.model.rest.PatchDefinition;
+import org.apache.camel.model.rest.PostDefinition;
+import org.apache.camel.model.rest.PutDefinition;
+import org.apache.camel.model.rest.ResponseHeaderDefinition;
+import org.apache.camel.model.rest.ResponseMessageDefinition;
+import org.apache.camel.model.rest.RestBindingDefinition;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.apache.camel.model.rest.RestConfigurationDefinition;
+import org.apache.camel.model.rest.RestDefinition;
+import org.apache.camel.model.rest.RestHostNameResolver;
+import org.apache.camel.model.rest.RestParamType;
+import org.apache.camel.model.rest.RestPropertyDefinition;
+import org.apache.camel.model.rest.RestSecuritiesDefinition;
+import org.apache.camel.model.rest.RestSecurityDefinition;
+import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.model.rest.SecurityDefinition;
+import org.apache.camel.model.rest.VerbDefinition;
+import org.apache.camel.model.transformer.CustomTransformerDefinition;
+import org.apache.camel.model.transformer.DataFormatTransformerDefinition;
+import org.apache.camel.model.transformer.EndpointTransformerDefinition;
+import org.apache.camel.model.transformer.TransformerDefinition;
+import org.apache.camel.model.transformer.TransformersDefinition;
+import org.apache.camel.model.validator.CustomValidatorDefinition;
+import org.apache.camel.model.validator.EndpointValidatorDefinition;
+import org.apache.camel.model.validator.PredicateValidatorDefinition;
+import org.apache.camel.model.validator.ValidatorDefinition;
+import org.apache.camel.model.validator.ValidatorsDefinition;
import org.apache.camel.xml.io.XmlPullParserException;
@SuppressWarnings("unused")
@@ -2670,6 +2806,7 @@ public class ModelParser extends BaseParser {
case "headerName": def.setHeaderName(val); break;
case "option": def.setOption(val); break;
case "resultType": def.setResultTypeName(val); break;
+ case "supportPojoAsMapAndList": def.setSupportPojoAsMapAndList(val); break;
case "suppressExceptions": def.setSuppressExceptions(val); break;
case "writeAsString": def.setWriteAsString(val); break;
default: return expressionDefinitionAttributeHandler().accept(def, key, val);