This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-3.14.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 5440c6ab01a5a4683b2d1b34383037b26571c070
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Tue Mar 1 16:09:24 2022 +0100

    CAMEL-17704: camel-netty-starter - Unable to set 
camel.component.netty.decoders
---
 .../http/NettyHttpConfigurationConfigurer.java     | 28 +++++--
 .../camel/component/netty/http/netty-http.json     |  8 +-
 .../netty/http/HttpClientInitializerFactory.java   |  4 +-
 .../netty/http/HttpServerInitializerFactory.java   |  4 +-
 .../netty/http/NettyHttpConfiguration.java         |  8 +-
 components/camel-netty/pom.xml                     |  5 ++
 .../component/netty/NettyComponentConfigurer.java  | 10 +--
 .../netty/NettyConfigurationConfigurer.java        | 28 +++++--
 .../component/netty/NettyEndpointConfigurer.java   | 10 +--
 .../org/apache/camel/component/netty/netty.json    |  8 +-
 .../netty/DefaultClientInitializerFactory.java     |  4 +-
 .../netty/DefaultServerInitializerFactory.java     |  4 +-
 .../camel/component/netty/NettyConfiguration.java  | 97 +++++++++++++++-------
 .../component/netty/MainNettyCustomCodecTest.java  | 60 +++++++++++++
 14 files changed, 200 insertions(+), 78 deletions(-)

diff --git 
a/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java
 
b/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java
index 2fc676d9298..f81752b3585 100644
--- 
a/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java
+++ 
b/components/camel-netty-http/src/generated/java/org/apache/camel/component/netty/http/NettyHttpConfigurationConfigurer.java
@@ -56,7 +56,9 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
         case "decodermaxlinelength":
         case "DecoderMaxLineLength": 
target.setDecoderMaxLineLength(property(camelContext, int.class, value)); 
return true;
         case "decoders":
-        case "Decoders": target.setDecoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "Decoders": target.setDecoders(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "decodersaslist":
+        case "DecodersAsList": target.setDecodersAsList(property(camelContext, 
java.util.List.class, value)); return true;
         case "delimiter":
         case "Delimiter": target.setDelimiter(property(camelContext, 
org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true;
         case "disablestreamcache":
@@ -68,7 +70,9 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
         case "enabledprotocols":
         case "EnabledProtocols": 
target.setEnabledProtocols(property(camelContext, java.lang.String.class, 
value)); return true;
         case "encoders":
-        case "Encoders": target.setEncoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "Encoders": target.setEncoders(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "encodersaslist":
+        case "EncodersAsList": target.setEncodersAsList(property(camelContext, 
java.util.List.class, value)); return true;
         case "encoding":
         case "Encoding": target.setEncoding(property(camelContext, 
java.lang.String.class, value)); return true;
         case "host":
@@ -239,7 +243,9 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
         case "decodermaxlinelength":
         case "DecoderMaxLineLength": return int.class;
         case "decoders":
-        case "Decoders": return java.util.List.class;
+        case "Decoders": return java.lang.String.class;
+        case "decodersaslist":
+        case "DecodersAsList": return java.util.List.class;
         case "delimiter":
         case "Delimiter": return 
org.apache.camel.component.netty.TextLineDelimiter.class;
         case "disablestreamcache":
@@ -251,7 +257,9 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
         case "enabledprotocols":
         case "EnabledProtocols": return java.lang.String.class;
         case "encoders":
-        case "Encoders": return java.util.List.class;
+        case "Encoders": return java.lang.String.class;
+        case "encodersaslist":
+        case "EncodersAsList": return java.util.List.class;
         case "encoding":
         case "Encoding": return java.lang.String.class;
         case "host":
@@ -424,6 +432,8 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
         case "DecoderMaxLineLength": return target.getDecoderMaxLineLength();
         case "decoders":
         case "Decoders": return target.getDecoders();
+        case "decodersaslist":
+        case "DecodersAsList": return target.getDecodersAsList();
         case "delimiter":
         case "Delimiter": return target.getDelimiter();
         case "disablestreamcache":
@@ -436,6 +446,8 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
         case "EnabledProtocols": return target.getEnabledProtocols();
         case "encoders":
         case "Encoders": return target.getEncoders();
+        case "encodersaslist":
+        case "EncodersAsList": return target.getEncodersAsList();
         case "encoding":
         case "Encoding": return target.getEncoding();
         case "host":
@@ -571,10 +583,10 @@ public class NettyHttpConfigurationConfigurer extends 
org.apache.camel.support.c
     @Override
     public Object getCollectionValueType(Object target, String name, boolean 
ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
-        case "decoders":
-        case "Decoders": return io.netty.channel.ChannelHandler.class;
-        case "encoders":
-        case "Encoders": return io.netty.channel.ChannelHandler.class;
+        case "decodersaslist":
+        case "DecodersAsList": return io.netty.channel.ChannelHandler.class;
+        case "encodersaslist":
+        case "EncodersAsList": return io.netty.channel.ChannelHandler.class;
         case "options":
         case "Options": return java.lang.Object.class;
         default: return null;
diff --git 
a/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json
 
b/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json
index a18f1103efe..01aaa847621 100644
--- 
a/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json
+++ 
b/components/camel-netty-http/src/generated/resources/org/apache/camel/component/netty/http/netty-http.json
@@ -80,9 +80,9 @@
     "allowDefaultCodec": { "kind": "property", "displayName": "Allow Default 
Codec", "group": "codec", "label": "codec", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The netty component installs a default codec 
if both, encoder\/decoder is null and textline is fal [...]
     "autoAppendDelimiter": { "kind": "property", "displayName": "Auto Append 
Delimiter", "group": "codec", "label": "codec", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "Whether or not to auto append missing end 
delimiter when sending using the textline codec." },
     "decoderMaxLineLength": { "kind": "property", "displayName": "Decoder Max 
Line Length", "group": "codec", "label": "codec", "required": false, "type": 
"integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 1024, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The max line length to use for the textline 
codec." },
-    "decoders": { "kind": "property", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "A list of decoders to be used. You can use a 
String which have values separated by comma, and have the [...]
+    "decoders": { "kind": "property", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "A list of decoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up in the Re [...]
     "delimiter": { "kind": "property", "displayName": "Delimiter", "group": 
"codec", "label": "codec", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.netty.TextLineDelimiter", "enum": [ "LINE", "NULL" 
], "deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"LINE", "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The delimiter to use for the textline codec. 
[...]
-    "encoders": { "kind": "property", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "A list of encoders to be used. You can use a 
String which have values separated by comma, and have the [...]
+    "encoders": { "kind": "property", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "A list of encoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up in the Re [...]
     "encoding": { "kind": "property", "displayName": "Encoding", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "The encoding (a charset 
name) to use for the textline codec. If not provided, Camel will use the JVM 
default Charset." },
     "textline": { "kind": "property", "displayName": "Textline", "group": 
"codec", "label": "codec", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "Only used for TCP. If no codec is specified, 
you can use this flag to indicate a text line based codec; if not specif [...]
     "enabledProtocols": { "kind": "property", "displayName": "Enabled 
Protocols", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "Which protocols to 
enable when using SSL" },
@@ -169,8 +169,8 @@
     "transferExchange": { "kind": "parameter", "displayName": "Transfer 
Exchange", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "Only used for TCP. You 
can transfer the exchange over the wire instead of just the b [...]
     "workerCount": { "kind": "parameter", "displayName": "Worker Count", 
"group": "advanced", "label": "advanced", "required": false, "type": "integer", 
"javaType": "int", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "When netty works on nio 
mode, it uses default workerCount parameter from Netty (which is 
cpu_core_threads x 2). User can  [...]
     "workerGroup": { "kind": "parameter", "displayName": "Worker Group", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "io.netty.channel.EventLoopGroup", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "To use a explicit 
EventLoopGroup as the boss thread pool. For example to share a thread pool w 
[...]
-    "decoders": { "kind": "parameter", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "A list of decoders to be 
used. You can use a String which have values separated by comma, an [...]
-    "encoders": { "kind": "parameter", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "A list of encoders to be 
used. You can use a String which have values separated by comma, an [...]
+    "decoders": { "kind": "parameter", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "A list of decoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up [...]
+    "encoders": { "kind": "parameter", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "A list of encoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up [...]
     "enabledProtocols": { "kind": "parameter", "displayName": "Enabled 
Protocols", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", 
"configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "Which protocols to 
enable when using SSL" },
     "keyStoreFile": { "kind": "parameter", "displayName": "Key Store File", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.io.File", "deprecated": false, "autowired": false, "secret": 
false, "configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "Client side certificate 
keystore to be used for encryption" },
     "keyStoreFormat": { "kind": "parameter", "displayName": "Key Store 
Format", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.http.NettyHttpConfiguration", 
"configurationField": "configuration", "description": "Keystore format to be 
used for payload encryption. Defaults to JKS if not set" },
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java
index 953e90870c6..7ee0bc61211 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpClientInitializerFactory.java
@@ -93,7 +93,7 @@ public class HttpClientInitializerFactory extends 
ClientInitializerFactory {
 
         pipeline.addLast("http", new HttpClientCodec());
 
-        List<ChannelHandler> encoders = 
producer.getConfiguration().getEncoders();
+        List<ChannelHandler> encoders = 
producer.getConfiguration().getEncodersAsList();
         for (int x = 0; x < encoders.size(); x++) {
             ChannelHandler encoder = encoders.get(x);
             if (encoder instanceof ChannelHandlerFactory) {
@@ -103,7 +103,7 @@ public class HttpClientInitializerFactory extends 
ClientInitializerFactory {
             pipeline.addLast("encoder-" + x, encoder);
         }
 
-        List<ChannelHandler> decoders = 
producer.getConfiguration().getDecoders();
+        List<ChannelHandler> decoders = 
producer.getConfiguration().getDecodersAsList();
         for (int x = 0; x < decoders.size(); x++) {
             ChannelHandler decoder = decoders.get(x);
             if (decoder instanceof ChannelHandlerFactory) {
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java
index f28c789e649..6678df7c948 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/HttpServerInitializerFactory.java
@@ -95,7 +95,7 @@ public class HttpServerInitializerFactory extends 
ServerInitializerFactory {
         }
 
         pipeline.addLast("decoder", new HttpRequestDecoder(4096, 
configuration.getMaxHeaderSize(), 8192));
-        List<ChannelHandler> decoders = 
consumer.getConfiguration().getDecoders();
+        List<ChannelHandler> decoders = 
consumer.getConfiguration().getDecodersAsList();
         for (int x = 0; x < decoders.size(); x++) {
             ChannelHandler decoder = decoders.get(x);
             if (decoder instanceof ChannelHandlerFactory) {
@@ -105,7 +105,7 @@ public class HttpServerInitializerFactory extends 
ServerInitializerFactory {
             pipeline.addLast("decoder-" + x, decoder);
         }
         pipeline.addLast("encoder", new HttpResponseEncoder());
-        List<ChannelHandler> encoders = 
consumer.getConfiguration().getEncoders();
+        List<ChannelHandler> encoders = 
consumer.getConfiguration().getEncodersAsList();
         for (int x = 0; x < encoders.size(); x++) {
             ChannelHandler encoder = encoders.get(x);
             if (encoder instanceof ChannelHandlerFactory) {
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
index a6893bc43af..5949dcd2072 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/NettyHttpConfiguration.java
@@ -17,9 +17,7 @@
 package org.apache.camel.component.netty.http;
 
 import java.util.ArrayList;
-import java.util.List;
 
-import io.netty.channel.ChannelHandler;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.netty.NettyConfiguration;
 import org.apache.camel.spi.Configurer;
@@ -93,10 +91,8 @@ public class NettyHttpConfiguration extends 
NettyConfiguration {
             // clone as NettyHttpConfiguration
             NettyHttpConfiguration answer = (NettyHttpConfiguration) clone();
             // make sure the lists is copied in its own instance
-            List<ChannelHandler> encodersCopy = new ArrayList<>(getEncoders());
-            answer.setEncoders(encodersCopy);
-            List<ChannelHandler> decodersCopy = new ArrayList<>(getDecoders());
-            answer.setDecoders(decodersCopy);
+            answer.setEncodersAsList(new ArrayList<>(getEncodersAsList()));
+            answer.setDecodersAsList(new ArrayList<>(getDecodersAsList()));
             return answer;
         } catch (CloneNotSupportedException e) {
             throw new RuntimeCamelException(e);
diff --git a/components/camel-netty/pom.xml b/components/camel-netty/pom.xml
index c389ae97974..1a165318965 100644
--- a/components/camel-netty/pom.xml
+++ b/components/camel-netty/pom.xml
@@ -91,6 +91,11 @@
             <artifactId>camel-management</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-main</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter</artifactId>
diff --git 
a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java
 
b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java
index 926df0700cb..86ae0fda93a 100644
--- 
a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java
+++ 
b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyComponentConfigurer.java
@@ -57,14 +57,14 @@ public class NettyComponentConfigurer extends 
PropertyConfigurerSupport implemen
         case "correlationManager": 
getOrCreateConfiguration(target).setCorrelationManager(property(camelContext, 
org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class, 
value)); return true;
         case "decodermaxlinelength":
         case "decoderMaxLineLength": 
getOrCreateConfiguration(target).setDecoderMaxLineLength(property(camelContext, 
int.class, value)); return true;
-        case "decoders": 
getOrCreateConfiguration(target).setDecoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "decoders": 
getOrCreateConfiguration(target).setDecoders(property(camelContext, 
java.lang.String.class, value)); return true;
         case "delimiter": 
getOrCreateConfiguration(target).setDelimiter(property(camelContext, 
org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true;
         case "disconnect": 
getOrCreateConfiguration(target).setDisconnect(property(camelContext, 
boolean.class, value)); return true;
         case "disconnectonnoreply":
         case "disconnectOnNoReply": 
getOrCreateConfiguration(target).setDisconnectOnNoReply(property(camelContext, 
boolean.class, value)); return true;
         case "enabledprotocols":
         case "enabledProtocols": 
getOrCreateConfiguration(target).setEnabledProtocols(property(camelContext, 
java.lang.String.class, value)); return true;
-        case "encoders": 
getOrCreateConfiguration(target).setEncoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "encoders": 
getOrCreateConfiguration(target).setEncoders(property(camelContext, 
java.lang.String.class, value)); return true;
         case "encoding": 
getOrCreateConfiguration(target).setEncoding(property(camelContext, 
java.lang.String.class, value)); return true;
         case "executorservice":
         case "executorService": 
target.setExecutorService(property(camelContext, 
io.netty.util.concurrent.EventExecutorGroup.class, value)); return true;
@@ -196,14 +196,14 @@ public class NettyComponentConfigurer extends 
PropertyConfigurerSupport implemen
         case "correlationManager": return 
org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class;
         case "decodermaxlinelength":
         case "decoderMaxLineLength": return int.class;
-        case "decoders": return java.util.List.class;
+        case "decoders": return java.lang.String.class;
         case "delimiter": return 
org.apache.camel.component.netty.TextLineDelimiter.class;
         case "disconnect": return boolean.class;
         case "disconnectonnoreply":
         case "disconnectOnNoReply": return boolean.class;
         case "enabledprotocols":
         case "enabledProtocols": return java.lang.String.class;
-        case "encoders": return java.util.List.class;
+        case "encoders": return java.lang.String.class;
         case "encoding": return java.lang.String.class;
         case "executorservice":
         case "executorService": return 
io.netty.util.concurrent.EventExecutorGroup.class;
@@ -446,8 +446,6 @@ public class NettyComponentConfigurer extends 
PropertyConfigurerSupport implemen
     @Override
     public Object getCollectionValueType(Object target, String name, boolean 
ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
-        case "decoders": return io.netty.channel.ChannelHandler.class;
-        case "encoders": return io.netty.channel.ChannelHandler.class;
         case "options": return java.lang.Object.class;
         default: return null;
         }
diff --git 
a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java
 
b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java
index 51f1a937a25..447689dcd3b 100644
--- 
a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java
+++ 
b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyConfigurationConfigurer.java
@@ -50,7 +50,9 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
         case "decodermaxlinelength":
         case "DecoderMaxLineLength": 
target.setDecoderMaxLineLength(property(camelContext, int.class, value)); 
return true;
         case "decoders":
-        case "Decoders": target.setDecoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "Decoders": target.setDecoders(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "decodersaslist":
+        case "DecodersAsList": target.setDecodersAsList(property(camelContext, 
java.util.List.class, value)); return true;
         case "delimiter":
         case "Delimiter": target.setDelimiter(property(camelContext, 
org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true;
         case "disconnect":
@@ -60,7 +62,9 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
         case "enabledprotocols":
         case "EnabledProtocols": 
target.setEnabledProtocols(property(camelContext, java.lang.String.class, 
value)); return true;
         case "encoders":
-        case "Encoders": target.setEncoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "Encoders": target.setEncoders(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "encodersaslist":
+        case "EncodersAsList": target.setEncodersAsList(property(camelContext, 
java.util.List.class, value)); return true;
         case "encoding":
         case "Encoding": target.setEncoding(property(camelContext, 
java.lang.String.class, value)); return true;
         case "host":
@@ -199,7 +203,9 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
         case "decodermaxlinelength":
         case "DecoderMaxLineLength": return int.class;
         case "decoders":
-        case "Decoders": return java.util.List.class;
+        case "Decoders": return java.lang.String.class;
+        case "decodersaslist":
+        case "DecodersAsList": return java.util.List.class;
         case "delimiter":
         case "Delimiter": return 
org.apache.camel.component.netty.TextLineDelimiter.class;
         case "disconnect":
@@ -209,7 +215,9 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
         case "enabledprotocols":
         case "EnabledProtocols": return java.lang.String.class;
         case "encoders":
-        case "Encoders": return java.util.List.class;
+        case "Encoders": return java.lang.String.class;
+        case "encodersaslist":
+        case "EncodersAsList": return java.util.List.class;
         case "encoding":
         case "Encoding": return java.lang.String.class;
         case "host":
@@ -350,6 +358,8 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
         case "DecoderMaxLineLength": return target.getDecoderMaxLineLength();
         case "decoders":
         case "Decoders": return target.getDecoders();
+        case "decodersaslist":
+        case "DecodersAsList": return target.getDecodersAsList();
         case "delimiter":
         case "Delimiter": return target.getDelimiter();
         case "disconnect":
@@ -360,6 +370,8 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
         case "EnabledProtocols": return target.getEnabledProtocols();
         case "encoders":
         case "Encoders": return target.getEncoders();
+        case "encodersaslist":
+        case "EncodersAsList": return target.getEncodersAsList();
         case "encoding":
         case "Encoding": return target.getEncoding();
         case "host":
@@ -469,10 +481,10 @@ public class NettyConfigurationConfigurer extends 
org.apache.camel.support.compo
     @Override
     public Object getCollectionValueType(Object target, String name, boolean 
ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
-        case "decoders":
-        case "Decoders": return io.netty.channel.ChannelHandler.class;
-        case "encoders":
-        case "Encoders": return io.netty.channel.ChannelHandler.class;
+        case "decodersaslist":
+        case "DecodersAsList": return io.netty.channel.ChannelHandler.class;
+        case "encodersaslist":
+        case "EncodersAsList": return io.netty.channel.ChannelHandler.class;
         case "options":
         case "Options": return java.lang.Object.class;
         default: return null;
diff --git 
a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java
 
b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java
index 168ad062563..de52af20f45 100644
--- 
a/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java
+++ 
b/components/camel-netty/src/generated/java/org/apache/camel/component/netty/NettyEndpointConfigurer.java
@@ -47,14 +47,14 @@ public class NettyEndpointConfigurer extends 
PropertyConfigurerSupport implement
         case "correlationManager": 
target.getConfiguration().setCorrelationManager(property(camelContext, 
org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class, 
value)); return true;
         case "decodermaxlinelength":
         case "decoderMaxLineLength": 
target.getConfiguration().setDecoderMaxLineLength(property(camelContext, 
int.class, value)); return true;
-        case "decoders": 
target.getConfiguration().setDecoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "decoders": 
target.getConfiguration().setDecoders(property(camelContext, 
java.lang.String.class, value)); return true;
         case "delimiter": 
target.getConfiguration().setDelimiter(property(camelContext, 
org.apache.camel.component.netty.TextLineDelimiter.class, value)); return true;
         case "disconnect": 
target.getConfiguration().setDisconnect(property(camelContext, boolean.class, 
value)); return true;
         case "disconnectonnoreply":
         case "disconnectOnNoReply": 
target.getConfiguration().setDisconnectOnNoReply(property(camelContext, 
boolean.class, value)); return true;
         case "enabledprotocols":
         case "enabledProtocols": 
target.getConfiguration().setEnabledProtocols(property(camelContext, 
java.lang.String.class, value)); return true;
-        case "encoders": 
target.getConfiguration().setEncoders(property(camelContext, 
java.util.List.class, value)); return true;
+        case "encoders": 
target.getConfiguration().setEncoders(property(camelContext, 
java.lang.String.class, value)); return true;
         case "encoding": 
target.getConfiguration().setEncoding(property(camelContext, 
java.lang.String.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": 
target.setExceptionHandler(property(camelContext, 
org.apache.camel.spi.ExceptionHandler.class, value)); return true;
@@ -182,14 +182,14 @@ public class NettyEndpointConfigurer extends 
PropertyConfigurerSupport implement
         case "correlationManager": return 
org.apache.camel.component.netty.NettyCamelStateCorrelationManager.class;
         case "decodermaxlinelength":
         case "decoderMaxLineLength": return int.class;
-        case "decoders": return java.util.List.class;
+        case "decoders": return java.lang.String.class;
         case "delimiter": return 
org.apache.camel.component.netty.TextLineDelimiter.class;
         case "disconnect": return boolean.class;
         case "disconnectonnoreply":
         case "disconnectOnNoReply": return boolean.class;
         case "enabledprotocols":
         case "enabledProtocols": return java.lang.String.class;
-        case "encoders": return java.util.List.class;
+        case "encoders": return java.lang.String.class;
         case "encoding": return java.lang.String.class;
         case "exceptionhandler":
         case "exceptionHandler": return 
org.apache.camel.spi.ExceptionHandler.class;
@@ -427,8 +427,6 @@ public class NettyEndpointConfigurer extends 
PropertyConfigurerSupport implement
     @Override
     public Object getCollectionValueType(Object target, String name, boolean 
ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
-        case "decoders": return io.netty.channel.ChannelHandler.class;
-        case "encoders": return io.netty.channel.ChannelHandler.class;
         case "options": return java.lang.Object.class;
         default: return null;
         }
diff --git 
a/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json
 
b/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json
index ae868eb8e0c..f7476d0e0eb 100644
--- 
a/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json
+++ 
b/components/camel-netty/src/generated/resources/org/apache/camel/component/netty/netty.json
@@ -76,9 +76,9 @@
     "allowDefaultCodec": { "kind": "property", "displayName": "Allow Default 
Codec", "group": "codec", "label": "codec", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The netty component installs a default codec 
if both, encoder\/decoder is null and textline is fal [...]
     "autoAppendDelimiter": { "kind": "property", "displayName": "Auto Append 
Delimiter", "group": "codec", "label": "codec", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "Whether or not to auto append missing end 
delimiter when sending using the textline codec." },
     "decoderMaxLineLength": { "kind": "property", "displayName": "Decoder Max 
Line Length", "group": "codec", "label": "codec", "required": false, "type": 
"integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 1024, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The max line length to use for the textline 
codec." },
-    "decoders": { "kind": "property", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "A list of decoders to be used. You can use a 
String which have values separated by comma, and have the [...]
+    "decoders": { "kind": "property", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "A list of decoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up in the Re [...]
     "delimiter": { "kind": "property", "displayName": "Delimiter", "group": 
"codec", "label": "codec", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.netty.TextLineDelimiter", "enum": [ "LINE", "NULL" 
], "deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"LINE", "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The delimiter to use for the textline codec. 
[...]
-    "encoders": { "kind": "property", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "A list of encoders to be used. You can use a 
String which have values separated by comma, and have the [...]
+    "encoders": { "kind": "property", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "A list of encoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up in the Re [...]
     "encoding": { "kind": "property", "displayName": "Encoding", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "The encoding (a charset 
name) to use for the textline codec. If not provided, Camel will use the JVM 
default Charset." },
     "textline": { "kind": "property", "displayName": "Textline", "group": 
"codec", "label": "codec", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "Only used for TCP. If no codec is specified, 
you can use this flag to indicate a text line based codec; if not specif [...]
     "enabledProtocols": { "kind": "property", "displayName": "Enabled 
Protocols", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "Which protocols to 
enable when using SSL" },
@@ -153,9 +153,9 @@
     "allowDefaultCodec": { "kind": "parameter", "displayName": "Allow Default 
Codec", "group": "codec", "label": "codec", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The netty component installs a default codec 
if both, encoder\/decoder is null and textline is fa [...]
     "autoAppendDelimiter": { "kind": "parameter", "displayName": "Auto Append 
Delimiter", "group": "codec", "label": "codec", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "Whether or not to auto append missing end 
delimiter when sending using the textline codec." },
     "decoderMaxLineLength": { "kind": "parameter", "displayName": "Decoder Max 
Line Length", "group": "codec", "label": "codec", "required": false, "type": 
"integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 1024, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The max line length to use for the textline 
codec." },
-    "decoders": { "kind": "parameter", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "A list of decoders to be used. You can use a 
String which have values separated by comma, and have th [...]
+    "decoders": { "kind": "parameter", "displayName": "Decoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "A list of decoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up in the R [...]
     "delimiter": { "kind": "parameter", "displayName": "Delimiter", "group": 
"codec", "label": "codec", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.netty.TextLineDelimiter", "enum": [ "LINE", "NULL" 
], "deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"LINE", "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "The delimiter to use for the textline codec 
[...]
-    "encoders": { "kind": "parameter", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "array", "javaType": 
"java.util.List<io.netty.channel.ChannelHandler>", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "A list of encoders to be used. You can use a 
String which have values separated by comma, and have th [...]
+    "encoders": { "kind": "parameter", "displayName": "Encoders", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "A list of encoders to be 
used. You can use a String which have values separated by comma, and have the 
values be looked up in the R [...]
     "encoding": { "kind": "parameter", "displayName": "Encoding", "group": 
"codec", "label": "codec", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "The encoding (a charset 
name) to use for the textline codec. If not provided, Camel will use the JVM 
default Charset." },
     "textline": { "kind": "parameter", "displayName": "Textline", "group": 
"codec", "label": "codec", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.netty.NettyConfiguration", "configurationField": 
"configuration", "description": "Only used for TCP. If no codec is specified, 
you can use this flag to indicate a text line based codec; if not speci [...]
     "enabledProtocols": { "kind": "parameter", "displayName": "Enabled 
Protocols", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "TLSv1,TLSv1.1,TLSv1.2", 
"configurationClass": "org.apache.camel.component.netty.NettyConfiguration", 
"configurationField": "configuration", "description": "Which protocols to 
enable when using SSL" },
diff --git 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java
 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java
index af089219ca4..ce7759da545 100644
--- 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java
+++ 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultClientInitializerFactory.java
@@ -62,7 +62,7 @@ public class DefaultClientInitializerFactory extends 
ClientInitializerFactory {
             addToPipeline("ssl", channelPipeline, sslHandler);
         }
 
-        List<ChannelHandler> decoders = 
producer.getConfiguration().getDecoders();
+        List<ChannelHandler> decoders = 
producer.getConfiguration().getDecodersAsList();
         for (int x = 0; x < decoders.size(); x++) {
             ChannelHandler decoder = decoders.get(x);
             if (decoder instanceof ChannelHandlerFactory) {
@@ -72,7 +72,7 @@ public class DefaultClientInitializerFactory extends 
ClientInitializerFactory {
             addToPipeline("decoder-" + x, channelPipeline, decoder);
         }
 
-        List<ChannelHandler> encoders = 
producer.getConfiguration().getEncoders();
+        List<ChannelHandler> encoders = 
producer.getConfiguration().getEncodersAsList();
         for (int x = 0; x < encoders.size(); x++) {
             ChannelHandler encoder = encoders.get(x);
             if (encoder instanceof ChannelHandlerFactory) {
diff --git 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java
 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java
index 76b73f3b949..bfc5fad422d 100644
--- 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java
+++ 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/DefaultServerInitializerFactory.java
@@ -80,7 +80,7 @@ public class DefaultServerInitializerFactory extends 
ServerInitializerFactory {
             addToPipeline("ssl", channelPipeline, sslHandler);
         }
 
-        List<ChannelHandler> encoders = 
consumer.getConfiguration().getEncoders();
+        List<ChannelHandler> encoders = 
consumer.getConfiguration().getEncodersAsList();
         for (int x = 0; x < encoders.size(); x++) {
             ChannelHandler encoder = encoders.get(x);
             if (encoder instanceof ChannelHandlerFactory) {
@@ -90,7 +90,7 @@ public class DefaultServerInitializerFactory extends 
ServerInitializerFactory {
             addToPipeline("encoder-" + x, channelPipeline, encoder);
         }
 
-        List<ChannelHandler> decoders = 
consumer.getConfiguration().getDecoders();
+        List<ChannelHandler> decoders = 
consumer.getConfiguration().getDecodersAsList();
         for (int x = 0; x < decoders.size(); x++) {
             ChannelHandler decoder = decoders.get(x);
             if (decoder instanceof ChannelHandlerFactory) {
diff --git 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java
 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java
index 006eb844448..ca0f25b3c57 100644
--- 
a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java
+++ 
b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyConfiguration.java
@@ -51,6 +51,9 @@ import org.slf4j.LoggerFactory;
 public class NettyConfiguration extends NettyServerBootstrapConfiguration 
implements Cloneable {
     private static final Logger LOG = 
LoggerFactory.getLogger(NettyConfiguration.class);
 
+    private transient List<ChannelHandler> encodersList = new ArrayList<>();
+    private transient List<ChannelHandler> decodersList = new ArrayList<>();
+
     @UriParam(label = "producer")
     private long requestTimeout;
     @UriParam(defaultValue = "true")
@@ -66,9 +69,9 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
     @UriParam(label = "codec")
     private String encoding;
     @UriParam(label = "codec")
-    private List<ChannelHandler> encoders = new ArrayList<>();
+    private String encoders;
     @UriParam(label = "codec")
-    private List<ChannelHandler> decoders = new ArrayList<>();
+    private String decoders;
     @UriParam(label = "common, security", defaultValue = "false")
     private boolean hostnameVerification;
     @UriParam
@@ -123,10 +126,8 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
         try {
             NettyConfiguration answer = (NettyConfiguration) clone();
             // make sure the lists is copied in its own instance
-            List<ChannelHandler> encodersCopy = new ArrayList<>(encoders);
-            answer.setEncoders(encodersCopy);
-            List<ChannelHandler> decodersCopy = new ArrayList<>(decoders);
-            answer.setDecoders(decodersCopy);
+            answer.setEncodersAsList(new ArrayList<>(getEncodersAsList()));
+            answer.setDecodersAsList(new ArrayList<>(getDecodersAsList()));
             return answer;
         } catch (CloneNotSupportedException e) {
             throw new RuntimeCamelException(e);
@@ -135,7 +136,7 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
 
     public void validateConfiguration() {
         // validate that the encoders is either shareable or is a handler 
factory
-        for (ChannelHandler encoder : encoders) {
+        for (ChannelHandler encoder : encodersList) {
             if (encoder instanceof ChannelHandlerFactory) {
                 continue;
             }
@@ -148,7 +149,7 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
         }
 
         // validate that the decoders is either shareable or is a handler 
factory
-        for (ChannelHandler decoder : decoders) {
+        for (ChannelHandler decoder : decodersList) {
             if (decoder instanceof ChannelHandlerFactory) {
                 continue;
             }
@@ -208,10 +209,18 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
         // set custom encoders and decoders first
         List<ChannelHandler> referencedEncoders
                 = component.resolveAndRemoveReferenceListParameter(parameters, 
"encoders", ChannelHandler.class, null);
-        addToHandlersList(encoders, referencedEncoders, ChannelHandler.class);
+        addToHandlersList(encodersList, referencedEncoders, 
ChannelHandler.class);
         List<ChannelHandler> referencedDecoders
                 = component.resolveAndRemoveReferenceListParameter(parameters, 
"decoders", ChannelHandler.class, null);
-        addToHandlersList(decoders, referencedDecoders, ChannelHandler.class);
+        addToHandlersList(decodersList, referencedDecoders, 
ChannelHandler.class);
+
+        // set custom encoders and decoders from config
+        List<ChannelHandler> configEncoders
+                = 
EndpointHelper.resolveReferenceListParameter(component.getCamelContext(), 
encoders, ChannelHandler.class);
+        addToHandlersList(encodersList, configEncoders, ChannelHandler.class);
+        List<ChannelHandler> configDecoders
+                = 
EndpointHelper.resolveReferenceListParameter(component.getCamelContext(), 
decoders, ChannelHandler.class);
+        addToHandlersList(decodersList, configDecoders, ChannelHandler.class);
 
         // then set parameters with the help of the camel context type 
converters
         // and use configurer to avoid any reflection calls
@@ -233,36 +242,36 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
         }
 
         // add default encoders and decoders
-        if (encoders.isEmpty() && decoders.isEmpty()) {
+        if (encodersList.isEmpty() && decodersList.isEmpty()) {
             if (isAllowDefaultCodec()) {
                 if ("udp".equalsIgnoreCase(protocol)) {
-                    
encoders.add(ChannelHandlerFactories.newDatagramPacketEncoder());
+                    
encodersList.add(ChannelHandlerFactories.newDatagramPacketEncoder());
                 }
                 // are we textline or byte array
                 if (isTextline()) {
                     Charset charset = getEncoding() != null ? 
Charset.forName(getEncoding()) : CharsetUtil.UTF_8;
-                    
encoders.add(ChannelHandlerFactories.newStringEncoder(charset, protocol));
+                    
encodersList.add(ChannelHandlerFactories.newStringEncoder(charset, protocol));
                     ByteBuf[] delimiters
                             = delimiter == TextLineDelimiter.LINE ? 
Delimiters.lineDelimiter() : Delimiters.nulDelimiter();
-                    decoders.add(
+                    decodersList.add(
                             
ChannelHandlerFactories.newDelimiterBasedFrameDecoder(decoderMaxLineLength, 
delimiters, protocol));
-                    
decoders.add(ChannelHandlerFactories.newStringDecoder(charset, protocol));
+                    
decodersList.add(ChannelHandlerFactories.newStringDecoder(charset, protocol));
 
                     LOG.debug(
                             "Using textline encoders and decoders with 
charset: {}, delimiter: {} and decoderMaxLineLength: {}",
                             charset, delimiter, decoderMaxLineLength);
 
                 } else if ("udp".equalsIgnoreCase(protocol) && 
isUdpByteArrayCodec()) {
-                    
encoders.add(ChannelHandlerFactories.newByteArrayEncoder(protocol));
-                    
decoders.add(ChannelHandlerFactories.newByteArrayDecoder(protocol));
+                    
encodersList.add(ChannelHandlerFactories.newByteArrayEncoder(protocol));
+                    
decodersList.add(ChannelHandlerFactories.newByteArrayDecoder(protocol));
                 } else {
                     // Fall back to allowing Strings to be serialized only
                     Charset charset = getEncoding() != null ? 
Charset.forName(getEncoding()) : CharsetUtil.UTF_8;
-                    
encoders.add(ChannelHandlerFactories.newStringEncoder(charset, protocol));
-                    
decoders.add(ChannelHandlerFactories.newStringDecoder(charset, protocol));
+                    
encodersList.add(ChannelHandlerFactories.newStringEncoder(charset, protocol));
+                    
decodersList.add(ChannelHandlerFactories.newStringDecoder(charset, protocol));
                 }
                 if ("udp".equalsIgnoreCase(protocol)) {
-                    
decoders.add(ChannelHandlerFactories.newDatagramPacketDecoder());
+                    
decodersList.add(ChannelHandlerFactories.newDatagramPacketDecoder());
                 }
             } else {
                 LOG.debug("No encoders and decoders will be used");
@@ -382,8 +391,12 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
         this.encoding = encoding;
     }
 
-    public List<ChannelHandler> getDecoders() {
-        return decoders;
+    public List<ChannelHandler> getDecodersAsList() {
+        return decodersList;
+    }
+
+    public void setDecodersAsList(List<ChannelHandler> decoders) {
+        this.decodersList = decoders;
     }
 
     /**
@@ -391,11 +404,27 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
      * looked up in the Registry. Just remember to prefix the value with # so 
Camel knows it should lookup.
      */
     public void setDecoders(List<ChannelHandler> decoders) {
+        this.decodersList = decoders;
+    }
+
+    /**
+     * A list of decoders to be used. You can use a String which have values 
separated by comma, and have the values be
+     * looked up in the Registry. Just remember to prefix the value with # so 
Camel knows it should lookup.
+     */
+    public void setDecoders(String decoders) {
         this.decoders = decoders;
     }
 
-    public List<ChannelHandler> getEncoders() {
-        return encoders;
+    public String getDecoders() {
+        return decoders;
+    }
+
+    public List<ChannelHandler> getEncodersAsList() {
+        return encodersList;
+    }
+
+    public void setEncodersAsList(List<ChannelHandler> encoders) {
+        this.encodersList = encoders;
     }
 
     /**
@@ -403,15 +432,27 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
      * looked up in the Registry. Just remember to prefix the value with # so 
Camel knows it should lookup.
      */
     public void setEncoders(List<ChannelHandler> encoders) {
+        this.encodersList = encoders;
+    }
+
+    /**
+     * A list of encoders to be used. You can use a String which have values 
separated by comma, and have the values be
+     * looked up in the Registry. Just remember to prefix the value with # so 
Camel knows it should lookup.
+     */
+    public void setEncoders(String encoders) {
         this.encoders = encoders;
     }
 
+    public String getEncoders() {
+        return encoders;
+    }
+
     /**
      * Adds a custom ChannelHandler class that can be used to perform special 
marshalling of outbound payloads.
      */
     public void addEncoder(ChannelHandler encoder) {
-        if (!encoders.contains(encoder)) {
-            encoders.add(encoder);
+        if (!encodersList.contains(encoder)) {
+            encodersList.add(encoder);
         }
     }
 
@@ -419,8 +460,8 @@ public class NettyConfiguration extends 
NettyServerBootstrapConfiguration implem
      * Adds a custom ChannelHandler class that can be used to perform special 
marshalling of inbound payloads.
      */
     public void addDecoder(ChannelHandler decoder) {
-        if (!decoders.contains(decoder)) {
-            decoders.add(decoder);
+        if (!decodersList.contains(decoder)) {
+            decodersList.add(decoder);
         }
     }
 
diff --git 
a/components/camel-netty/src/test/java/org/apache/camel/component/netty/MainNettyCustomCodecTest.java
 
b/components/camel-netty/src/test/java/org/apache/camel/component/netty/MainNettyCustomCodecTest.java
new file mode 100644
index 00000000000..36dd3fb2375
--- /dev/null
+++ 
b/components/camel-netty/src/test/java/org/apache/camel/component/netty/MainNettyCustomCodecTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.netty;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.main.Main;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class MainNettyCustomCodecTest extends BaseNettyTest {
+
+    // use reaadble bytes
+    private byte[] data = new byte[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 0, 
0 };
+
+    @Test
+    public void testMain() throws Exception {
+        Main main = new Main();
+        main.bind("myCustomDecoder", MyCustomCodec.createMyCustomDecoder());
+        main.bind("myCustomDecoder2", MyCustomCodec.createMyCustomDecoder2());
+        main.bind("myCustomEncoder", MyCustomCodec.createMyCustomEncoder());
+        main.addInitialProperty("camel.component.netty.encoders", 
"#myCustomEncoder");
+        main.addInitialProperty("camel.component.netty.decoders", 
"#myCustomDecoder,#myCustomDecoder2");
+        main.configure().addRoutesBuilder(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                String uri = "netty:tcp://localhost:" + getPort() + 
"?disconnect=true&sync=false&allowDefaultCodec=false";
+
+                from(uri).to("log:input")
+                        .process(e -> {
+                            byte[] local = 
e.getMessage().getBody(byte[].class);
+                            Assertions.assertEquals(data, local);
+                        });
+
+                from("timer:once?repeatCount=1")
+                        .setBody().constant(data)
+                        .to(uri);
+            }
+        });
+        main.configure().withDurationMaxMessages(2);
+        main.configure().withDurationMaxSeconds(5);
+        main.run();
+
+        main.stop();
+    }
+
+}

Reply via email to