Repository: Talend/component-runtime
Pull request #1041: feat(QTDI-1305): improve error in record 
Author: login: yyin-talend
Created: 2025-05-07T08:09:35Z | Merged: 2025-05-16T14:11:15Z

### Requirements

* Any code change adding any logic **MUST** be tested through a unit test executed with the default build
* Any API addition **MUST** be done with a documentation update if relevant 

### Why this PR is needed?

### What does this PR adds (design/code thoughts)?



Diff:
diff --git a/component-api/src/main/java/org/talend/sdk/component/api/record/Record.java b/component-api/src/main/java/org/talend/sdk/component/api/record/Record.java
index b9258587bdbee..341eb178d0783 100644
--- a/component-api/src/main/java/org/talend/sdk/component/api/record/Record.java
+++ b/component-api/src/main/java/org/talend/sdk/component/api/record/Record.java
@@ -34,6 +34,8 @@
 
 public interface Record {
 
+    String RECORD_ERROR_SUPPORT = "talend.component.record.error.support";
+
     /**
      * @return the schema of this record.
      */
@@ -311,6 +313,11 @@ default Optional<Record> getOptionalRecord(final String name) {
         return ofNullable(get(Record.class, name));
     }
 
+    default boolean isValid() {
+        return !getSchema().getAllEntries()
+                .anyMatch(entry -> !entry.isValid());
+    }
+
     /**
      * Allows to create a record with a fluent API. This is the unique recommended way to create a record.
      */
diff --git a/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java b/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java
index 5050102b4879e..210d903cca1e4 100644
--- a/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java
+++ b/component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java
@@ -232,6 +232,16 @@ interface Entry {
          */
         boolean isMetadata();
 
+        /**
+         * @return Is this entry can be in error.
+         */
+        boolean isErrorCapable();
+
+        /**
+         * @return true if the value of this entry is valid; false for invalid value.
+         */
+        boolean isValid();
+
         /**
          * @param <T> the default value type.
          *
@@ -296,6 +306,14 @@ default Entry.Builder toBuilder() {
             throw new UnsupportedOperationException("#toBuilder is not implemented");
         }
 
+        default String getErrorMessage() {
+            return getProp(SchemaProperty.ENTRY_ERROR_MESSAGE);
+        }
+
+        default String getErrorFallbackValue() {
+            return getProp(SchemaProperty.ENTRY_ERROR_FALLBACK_VALUE);
+        }
+
         /**
          * Plain builder matching {@link Entry} structure.
          */
@@ -317,6 +335,8 @@ default Builder withLogicalType(String logicalType) {
 
             Builder withNullable(boolean nullable);
 
+            Builder withErrorCapable(boolean errorCapable);
+
             Builder withMetadata(boolean metadata);
 
             <T> Builder withDefaultValue(T value);
diff --git a/component-api/src/main/java/org/talend/sdk/component/api/record/SchemaProperty.java b/component-api/src/main/java/org/talend/sdk/component/api/record/SchemaProperty.java
index 076467334ce3c..ea32ea06afa26 100644
--- a/component-api/src/main/java/org/talend/sdk/component/api/record/SchemaProperty.java
+++ b/component-api/src/main/java/org/talend/sdk/component/api/record/SchemaProperty.java
@@ -37,6 +37,12 @@ public interface SchemaProperty {
 
     String ALLOW_SPECIAL_NAME = "field.special.name";
 
+    String ENTRY_IS_ON_ERROR = "record.value.on.error";
+
+    String ENTRY_ERROR_MESSAGE = "record.value.on.error.message";
+
+    String ENTRY_ERROR_FALLBACK_VALUE = "record.value.on.error.fallback_value";
+
     enum LogicalType {
 
         DATE("date"),
diff --git a/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java b/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java
index 355e321ebedce..5192dc9f5c4c5 100644
--- a/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java
+++ b/component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java
@@ -129,6 +129,11 @@ public boolean isNullable() {
             return true;
         }
 
+        @Override
+        public boolean isErrorCapable() {
+            return false;
+        }
+
         @Override
         public boolean isMetadata() {
             return false;
@@ -163,6 +168,12 @@ public String getProp(final String property) {
         public Builder toBuilder() {
             throw new UnsupportedOperationException("#toBuilder()");
         }
+
+        @Override
+        public boolean isValid() {
+            return true;
+        }
+
     }
 
 }
diff --git a/component-api/src/test/java/org/talend/sdk/component/api/record/RecordTest.java b/component-api/src/test/java/org/talend/sdk/component/api/record/RecordTest.java
index c734c2bc50a55..63a9852487f4b 100644
--- a/component-api/src/test/java/org/talend/sdk/component/api/record/RecordTest.java
+++ b/component-api/src/test/java/org/talend/sdk/component/api/record/RecordTest.java
@@ -106,6 +106,11 @@ public boolean isNullable() {
                 return false;
             }
 
+            @Override
+            public boolean isErrorCapable() {
+                return false;
+            }
+
             @Override
             public boolean isMetadata() {
                 return false;
@@ -135,6 +140,11 @@ public Map<String, String> getProps() {
             public String getProp(String property) {
                 return null;
             }
+
+            @Override
+            public boolean isValid() {
+                return true;
+            }
         };
         Assertions.assertEquals("value", record.get(String.class, e1));
     }
diff --git a/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java b/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java
index 0157dabdff610..d1b8e6bb8094b 100644
--- a/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java
+++ b/component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java
@@ -291,6 +291,11 @@ public boolean isNullable() {
             throw new UnsupportedOperationException("#isNullable()");
         }
 
+        @Override
+        public boolean isErrorCapable() {
+            throw new UnsupportedOperationException("#isErrorCapable()");
+        }
+
         @Override
         public boolean isMetadata() {
             throw new UnsupportedOperationException("#isMetadata()");
@@ -326,6 +331,11 @@ public JsonValue getJsonProp(final String name) {
             return Entry.super.getJsonProp(name);
         }
 
+        @Override
+        public boolean isValid() {
+            return true;
+        }
+
     }
 
     class SchemaBuilder implements Schema.Builder {
diff --git a/component-api/src/test/java/org/talend/sdk/component/api/service/record/RecordBuilderFactoryTest.java b/component-api/src/test/java/org/talend/sdk/component/api/service/record/RecordBuilderFactoryTest.java
index 006ffddb6d3d2..ff2c4fba06b14 100644
--- a/component-api/src/test/java/org/talend/sdk/component/api/service/record/RecordBuilderFactoryTest.java
+++ b/component-api/src/test/java/org/talend/sdk/component/api/service/record/RecordBuilderFactoryTest.java
@@ -78,6 +78,8 @@ static class MockEntry implements Schema.Entry {
 
         private final boolean nullable;
 
+        private final boolean errorCapable;
+
         private final boolean metadata;
 
         private final Object defaultVal;
@@ -102,6 +104,11 @@ public String getProp(final String property) {
         public Builder toBuilder() {
             throw new UnsupportedOperationException("#toBuilder()");
         }
+
+        @Override
+        public boolean isValid() {
+            return true;
+        }
     }
 
     @RequiredArgsConstructor
@@ -135,6 +142,12 @@ public Entry.Builder withNullable(boolean nullable) {
             return this;
         }
 
+        @Override
+        public Entry.Builder withErrorCapable(boolean errorCapable) {
+            this.builder.withErrorCapable(errorCapable);
+            return this;
+        }
+
         @Override
         public Entry.Builder withMetadata(boolean metadata) {
             this.builder.withMetadata(metadata);
diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java
index b275246fe6ffb..41b0b164426dd 100644
--- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java
+++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecord.java
@@ -83,6 +83,8 @@ public AvroRecord(final Record record) {
         this.schema = AvroSchema.toAvroSchema(record.getSchema());
         this.delegate = new GenericData.Record(this.schema.getActualDelegate());
 
+        this.delegate.getSchema().addProp(KeysForAvroProperty.RECORD_IN_ERROR, String.valueOf(!record.isValid()));
+
         record
                 .getSchema()
                 .getAllEntries()
diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java
index 0a976b980ab81..a6dc888ba0128 100644
--- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java
+++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchema.java
@@ -216,12 +216,14 @@ private Entry fromAvro(final Field field) {
     }
 
     private static Entry buildFromAvro(final Field field, final Type type,
-            final Optional<SchemaProperty.LogicalType> logicalType, final AvroSchema elementSchema) {
+            final Optional<SchemaProperty.LogicalType> logicalType,
+            final AvroSchema elementSchema) {
         Entry.Builder builder = new EntryImpl.BuilderImpl() //
                 .withName(field.name()) //
                 .withRawName(field.getProp(KeysForAvroProperty.LABEL)) //
                 .withType(type) //
                 .withNullable(field.schema().getType() == UNION) //
+                .withErrorCapable(Boolean.parseBoolean(field.getProp(KeysForAvroProperty.IS_ERROR_CAPABLE)))
                 .withMetadata(AvroSchema.isMetadata(field)) //
                 .withDefaultValue(field.defaultVal()) //
                 .withElementSchema(elementSchema) //
@@ -229,6 +231,8 @@ private static Entry buildFromAvro(final Field field, final Type type,
                 .withProps(field.getObjectProps()
                         .entrySet()
                         .stream()
+                        // KeysForAvroProperty.IS_ERROR_CAPABLE is already managed above
+                        .filter(p -> !p.getKey().equals(KeysForAvroProperty.IS_ERROR_CAPABLE))
                         .collect(toMap(Map.Entry::getKey, e -> String.valueOf(e.getValue()))));
 
         logicalType.ifPresent(builder::withLogicalType);
diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchemaBuilder.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchemaBuilder.java
index 948501a242d33..e234a3a031ba7 100644
--- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchemaBuilder.java
+++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/AvroSchemaBuilder.java
@@ -463,7 +463,9 @@ public static Field toField(final org.apache.avro.Schema schema, final Schema.En
             for (Map.Entry<String, String> e : entry.getProps().entrySet()) {
                 field.addProp(e.getKey(), e.getValue());
             }
-
+            if (entry.isErrorCapable()) {
+                field.addProp(KeysForAvroProperty.IS_ERROR_CAPABLE, String.valueOf(entry.isErrorCapable()));
+            }
             return field;
         }
     }
diff --git a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/KeysForAvroProperty.java b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/KeysForAvroProperty.java
index a5d5b541cbaae..976a40984b3ba 100644
--- a/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/KeysForAvroProperty.java
+++ b/component-runtime-beam/src/main/java/org/talend/sdk/component/runtime/beam/spi/record/KeysForAvroProperty.java
@@ -21,4 +21,8 @@ public interface KeysForAvroProperty {
 
     // alias that indicate field is metadata if present.
     String METADATA_ALIAS_NAME = "talend.field.__METADATA__";
+
+    String IS_ERROR_CAPABLE = "talend.component.record.entry.errorCapable";
+
+    String RECORD_IN_ERROR = "talend.component.record.value.on.error";
 }
diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java
index 07fb3da564bf3..05a7544f3cb6d 100644
--- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java
+++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java
@@ -1,12 +1,12 @@
 /**
  * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
- *
+ * <p>
  * Licensed 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
- *
+ * <p>
  * http://www.apache.org/licenses/LICENSE-2.0
- *
+ * <p>
  * 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.
@@ -41,6 +41,7 @@
 import javax.json.JsonArray;
 import javax.json.JsonObject;
 
+import org.apache.avro.Schema.Field;
 import org.apache.avro.generic.GenericDatumWriter;
 import org.apache.avro.generic.IndexedRecord;
 import org.apache.avro.io.EncoderFactory;
@@ -209,6 +210,108 @@ void mixedRecordTest() {
         Assertions.assertNotNull(arrayType);
     }
 
+    @Test
+    void testWithoutErrorSupport() {
+        Assertions.assertThrows(IllegalArgumentException.class, () -> testWithError("false", true));
+    }
+
+    @Test
+    void testWithErrorSupportButNoError() {
+        Record record = testWithError("true", false);
+
+        IndexedRecord unwrap = ((AvroRecord) record).unwrap(IndexedRecord.class);
+
+        Assertions.assertTrue(unwrap.getSchema().getProp(KeysForAvroProperty.RECORD_IN_ERROR).equals("false"));
+
+        Field nameField = unwrap.getSchema().getFields().get(0);
+        Assertions.assertNull(nameField.getProp(SchemaProperty.ENTRY_IS_ON_ERROR));
+
+        Field ageField = unwrap.getSchema().getFields().get(2);
+        Assertions.assertNull(ageField.getProp(SchemaProperty.ENTRY_IS_ON_ERROR));
+    }
+
+    @Test
+    void testWithErrorSupport() {
+        Record record = testWithError("true", true);
+        assertFalse(record.isValid());
+
+        final Schema.Entry entry = record.getSchema().getEntry("name");
+        assertNotNull(entry);
+        Assertions.assertFalse(entry.isValid());
+        Assertions.assertNull(record.getString("name"));
+
+        final Schema.Entry entry2 = record.getSchema().getEntry("age");
+        assertNotNull(entry2);
+        Assertions.assertFalse(entry2.isValid());
+        Assertions.assertNull(record.get(Integer.class, "age"));
+
+        IndexedRecord unwrap = ((AvroRecord) record).unwrap(IndexedRecord.class);
+
+        Assertions.assertTrue(unwrap.getSchema().getProp(KeysForAvroProperty.RECORD_IN_ERROR).equals("true"));
+
+        Field nameField = unwrap.getSchema().getFields().get(0);
+        Assertions.assertEquals("true",
+                nameField.getProp(SchemaProperty.ENTRY_IS_ON_ERROR));
+        Assertions.assertEquals("Entry 'name' is not nullable",
+                nameField.getProp(SchemaProperty.ENTRY_ERROR_MESSAGE));
+        Assertions.assertEquals("null",
+                nameField.getProp(SchemaProperty.ENTRY_ERROR_FALLBACK_VALUE));
+
+        Field ageField = unwrap.getSchema().getFields().get(2);
+        Assertions.assertEquals("true",
+                ageField.getProp(SchemaProperty.ENTRY_IS_ON_ERROR));
+        Assertions.assertEquals("Entry 'age' of type INT is not compatible with given value of type " +
+                        "'java.lang.String': 'is not an int'.",
+                ageField.getProp(SchemaProperty.ENTRY_ERROR_MESSAGE));
+        Assertions.assertEquals("is not an int",
+                ageField.getProp(SchemaProperty.ENTRY_ERROR_FALLBACK_VALUE));
+
+        Field noErrorField = unwrap.getSchema().getFields().get(1);
+        Assertions.assertNull(noErrorField.getProp(SchemaProperty.ENTRY_IS_ON_ERROR));
+        Assertions.assertNull(noErrorField.getProp(SchemaProperty.ENTRY_ERROR_MESSAGE));
+        Assertions.assertNull(noErrorField.getProp(SchemaProperty.ENTRY_ERROR_FALLBACK_VALUE));
+
+    }
+
+    private Record testWithError(final String supported, final boolean genError) {
+        final String errorSupportBackup = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, supported);
+
+        org.talend.sdk.component.api.record.Schema.Builder schemaBuilder = factory.newSchemaBuilder(Schema.Type.RECORD);
+        Schema.Entry nameEntry = factory
+                .newEntryBuilder()
+                .withName("name")
+                .withErrorCapable(true)
+                .withNullable(false)
+                .withType(Schema.Type.STRING)
+                .build();
+        Schema.Entry noErrorEntry = factory
+                .newEntryBuilder()
+                .withName("normal")
+                .withErrorCapable(true)
+                .withNullable(true)
+                .withType(Schema.Type.STRING)
+                .build();
+        Schema.Entry ageEntry = factory
+                .newEntryBuilder()
+                .withName("age")
+                .withErrorCapable(true)
+                .withNullable(false)
+                .withType(Schema.Type.INT)
+                .build();
+        Schema customerSchema = schemaBuilder.withEntry(nameEntry).withEntry(noErrorEntry).withEntry(ageEntry).build();
+
+        Record.Builder recordBuilder = factory.newRecordBuilder(customerSchema);
+        Record record = recordBuilder.with(nameEntry, genError ? null : "a string")
+                .with(noErrorEntry, "normal")
+                .with(ageEntry, genError ? "is not an int" : 10)
+                .build();
+
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, errorSupportBackup == null ? "false" : errorSupportBackup);
+
+        return record;
+    }
+
     @Test
     void recordWithNewSchema() {
         final Schema schema0 = new AvroSchemaBuilder()//
@@ -520,8 +623,8 @@ private Schema.Entry newEntry(final String name, Schema.Type type) {
     }
 
     private Schema.Entry newEntry(final String name, String rawname, Schema.Type type, boolean nullable,
-            Object defaultValue,
-            String comment) {
+                                  Object defaultValue,
+                                  String comment) {
         return new EntryImpl.BuilderImpl()
                 .withName(name)
                 .withRawName(rawname)
@@ -537,7 +640,7 @@ private Schema.Entry newMetaEntry(final String name, Schema.Type type) {
     }
 
     private Schema.Entry newMetaEntry(final String name, String rawname, Schema.Type type, boolean nullable,
-            Object defaultValue, String comment) {
+                                      Object defaultValue, String comment) {
         return new EntryImpl.BuilderImpl()
                 .withName(name)
                 .withRawName(rawname)
diff --git a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java
index 607083f593ef2..791d653b0eb1c 100644
--- a/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java
+++ b/component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/JsonSchemaSerializationTest.java
@@ -49,7 +49,7 @@ void toJson() throws Exception {
                 .create(new JsonbConfig().withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL))) {
             final String json = jsonb.toJson(schema);
             assertEquals(
-                    "{\"entries\":[{\"elementSchema\":{\"entries\":[],\"metadata\":[],\"props\":{},\"type\":\"STRING\"},\"metadata\":false,\"name\":\"array\",\"nullable\":true,\"props\":{\"talend.component.label\":\"array\"},\"rawName\":\"array\",\"type\":\"ARRAY\"}],\"metadata\":[],\"props\":{\"talend.fields.order\":\"array\"},\"type\":\"RECORD\"}",
+                    "{\"entries\":[{\"elementSchema\":{\"entries\":[],\"metadata\":[],\"props\":{},\"type\":\"STRING\"},\"errorCapable\":false,\"metadata\":false,\"name\":\"array\",\"nullable\":true,\"props\":{\"talend.component.label\":\"array\"},\"rawName\":\"array\",\"type\":\"ARRAY\",\"valid\":true}],\"metadata\":[],\"props\":{\"talend.fields.order\":\"array\"},\"type\":\"RECORD\"}",
                     json);
         }
     }
@@ -71,7 +71,7 @@ void toJsonWithMeta() throws Exception {
         try (final Jsonb jsonb = JsonbBuilder
                 .create(new JsonbConfig().withPropertyOrderStrategy(PropertyOrderStrategy.LEXICOGRAPHICAL))) {
             assertEquals(
-                    "{\"entries\":[],\"metadata\":[{\"elementSchema\":{\"entries\":[],\"metadata\":[],\"props\":{},\"type\":\"STRING\"},\"metadata\":true,\"name\":\"array\",\"nullable\":true,\"props\":{\"talend.component.label\":\"array\"},\"rawName\":\"array\",\"type\":\"ARRAY\"}],\"props\":{\"talend.fields.order\":\"array\"},\"type\":\"RECORD\"}",
+                    "{\"entries\":[],\"metadata\":[{\"elementSchema\":{\"entries\":[],\"metadata\":[],\"props\":{},\"type\":\"STRING\"},\"errorCapable\":false,\"metadata\":true,\"name\":\"array\",\"nullable\":true,\"props\":{\"talend.component.label\":\"array\"},\"rawName\":\"array\",\"type\":\"ARRAY\",\"valid\":true}],\"props\":{\"talend.fields.order\":\"array\"},\"type\":\"RECORD\"}",
                     jsonb.toJson(schema));
 
         }
diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java
index 47c77ce50c529..31e2884860881 100644
--- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java
+++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java
@@ -61,6 +61,7 @@
 import org.talend.sdk.component.api.record.Schema;
 import org.talend.sdk.component.api.record.Schema.EntriesOrder;
 import org.talend.sdk.component.api.record.Schema.Entry;
+import org.talend.sdk.component.api.record.SchemaProperty;
 
 import lombok.EqualsAndHashCode;
 import lombok.Getter;
@@ -129,6 +130,8 @@ public static class BuilderImpl implements Builder {
 
         private OrderState orderState;
 
+        private final Map<String, Entry> entriesInError = new HashMap<>();
+
         public BuilderImpl() {
             this(null);
         }
@@ -150,7 +153,7 @@ private void initOrderState() {
                 } else {
                     final List<Entry> fields = this.providedSchema.naturalOrder()
                             .getFieldsOrder()
-                            .map(this.providedSchema::getEntry)
+                            .map(n -> this.getEntryWithErrorIfAny(this.providedSchema.getEntry(n)))
                             .collect(Collectors.toList());
                     this.orderState = new OrderState(fields);
                 }
@@ -171,11 +174,16 @@ public Object getValue(final String name) {
 
         @Override
         public Builder with(final Entry entry, final Object value) {
-            validateTypeAgainstProvidedSchema(entry.getName(), entry.getType(), value);
+            try {
+                validateTypeAgainstProvidedSchema(entry.getName(), entry.getType(), value);
+            } catch (Exception e) {
+                return withError(entry, value, e.getMessage());
+            }
             if (!entry.getType().isCompatible(value)) {
-                throw new IllegalArgumentException(String
-                        .format("Entry '%s' of type %s is not compatible with value of type '%s'", entry.getName(),
-                                entry.getType(), value.getClass().getName()));
+                return withError(entry, value, String
+                        .format("Entry '%s' of type %s is not compatible with given value of type '%s': '%s'.",
+                                entry.getOriginalFieldName(),
+                                entry.getType(), value.getClass().getName(), value));
             }
 
             if (entry.getType() == Schema.Type.DATETIME) {
@@ -315,33 +323,61 @@ private Schema.Entry validateTypeAgainstProvidedSchema(final String name, final
             final Schema.Entry entry = this.findExistingEntry(name);
             if (entry.getType() != type) {
                 throw new IllegalArgumentException(
-                        "Entry '" + name + "' expected to be a " + entry.getType() + ", got a " + type);
+                        "Entry '" + entry.getOriginalFieldName() + "' expected to be a " + entry.getType() + ", got a " + type);
             }
             if (value == null && !entry.isNullable()) {
-                throw new IllegalArgumentException("Entry '" + name + "' is not nullable");
+                throw new IllegalArgumentException("Entry '" + entry.getOriginalFieldName() + "' is not nullable");
             }
             return entry;
         }
 
+        /**
+         * This method return the updated entry with error information if any.
+         *
+         * @param e The entry to check.
+         * @return The entry updated with error information or the given one.
+         */
+        private Entry getEntryWithErrorIfAny(final Entry e) {
+            if (!e.isErrorCapable()) {
+                // The entry doesn't support error management
+                return e;
+            }
+
+            return entriesInError.getOrDefault(e.getOriginalFieldName(), e);
+        }
+
         public Record build() {
             final Schema currentSchema;
             if (this.providedSchema != null) {
                 final String missing = this.providedSchema
                         .getAllEntries()
+                        .map(this::getEntryWithErrorIfAny)
                         .filter(it -> !it.isNullable() && !values.containsKey(it.getName()))
                         .map(Schema.Entry::getName)
                         .collect(joining(", "));
                 if (!missing.isEmpty()) {
                     throw new IllegalArgumentException("Missing entries: " + missing);
                 }
+
+                Schema schemaWithErrors = this.providedSchema;
+                if (!this.entriesInError.isEmpty()) {
+                    Schema.Builder schemaBuilder = new SchemaImpl.BuilderImpl()
+                            .withType(this.providedSchema.getType());
+                    this.providedSchema.getEntries()
+                            .stream()
+                            .map(this::getEntryWithErrorIfAny)
+                            .forEach(schemaBuilder::withEntry);
+                    schemaWithErrors = schemaBuilder.build();
+                }
+
                 if (orderState != null && orderState.isOverride()) {
-                    currentSchema = this.providedSchema.toBuilder().build(this.orderState.buildComparator());
+                    currentSchema = schemaWithErrors.toBuilder().build(this.orderState.buildComparator());
                 } else {
-                    currentSchema = this.providedSchema;
+                    currentSchema = schemaWithErrors;
                 }
             } else {
                 final Schema.Builder builder = new SchemaImpl.BuilderImpl().withType(RECORD);
-                this.entries.forEachValue(builder::withEntry);
+                this.entries.streams().map(this::getEntryWithErrorIfAny).forEach(builder::withEntry);
                 initOrderState();
                 currentSchema = builder.build(orderState.buildComparator());
             }
@@ -513,6 +549,25 @@ public <T> Builder withArray(final Schema.Entry entry, final Collection<T> value
             return append(entry, values);
         }
 
+        private Builder withError(final Entry entry, final Object value, final String errorMessage) {
+            final boolean supportError = Boolean.parseBoolean(System.getProperty(RECORD_ERROR_SUPPORT, "false"));
+            if (!supportError || !entry.isErrorCapable()) {
+                throw new IllegalArgumentException(errorMessage);
+            } else {
+                // duplicate the schema instance with a modified Entry
+                final Entry updatedEntry = entry.toBuilder()
+                        .withName(entry.getName())
+                        .withNullable(true)
+                        .withType(entry.getType())
+                        .withProp(SchemaProperty.ENTRY_IS_ON_ERROR, "true")
+                        .withProp(SchemaProperty.ENTRY_ERROR_MESSAGE, errorMessage)
+                        .withProp(SchemaProperty.ENTRY_ERROR_FALLBACK_VALUE, String.valueOf(value))
+                        .build();
+                this.entriesInError.put(updatedEntry.getOriginalFieldName(), updatedEntry);
+                return this;
+            }
+        }
+
         private void assertType(final Schema.Type actual, final Schema.Type expected) {
             if (actual != expected) {
                 throw new IllegalArgumentException("Expected entry type: " + expected + ", got: " + actual);
diff --git a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java
index 035aec97f83aa..41886e2ee38b2 100644
--- a/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java
+++ b/component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/SchemaImpl.java
@@ -352,6 +352,7 @@ private EntryImpl(final EntryImpl.BuilderImpl builder) {
                 this.type = builder.type;
             }
             this.nullable = builder.nullable;
+            this.errorCapable = builder.errorCapable;
             this.metadata = builder.metadata;
             this.defaultValue = builder.defaultValue;
             this.elementSchema = builder.elementSchema;
@@ -379,6 +380,11 @@ private EntryImpl(final EntryImpl.BuilderImpl builder) {
          */
         private final boolean nullable;
 
+        /**
+         * Is this entry can be in error.
+         */
+        private final boolean errorCapable;
+
         /**
          * Is this entry a metadata entry.
          */
@@ -440,6 +446,11 @@ public boolean isNullable() {
             return this.nullable;
         }
 
+        @Override
+        public boolean isErrorCapable() {
+            return this.errorCapable;
+        }
+
         @Override
         public boolean isMetadata() {
             return this.metadata;
@@ -465,6 +476,15 @@ public Map<String, String> getProps() {
             return this.props;
         }
 
+        @Override
+        public boolean isValid() {
+            String property = this.getProp(SchemaProperty.ENTRY_IS_ON_ERROR);
+            if (property == null) {
+                return true;
+            }
+            return !Boolean.parseBoolean(property);
+        }
+
         /**
          * Plain builder matching {@link Entry} structure.
          */
@@ -478,6 +498,8 @@ public static class BuilderImpl implements Entry.Builder {
 
             private boolean nullable;
 
+            private boolean errorCapable;
+
             private boolean metadata = false;
 
             private Object defaultValue;
@@ -497,6 +519,7 @@ private BuilderImpl(final Entry entry) {
                 this.name = entry.getName();
                 this.rawName = entry.getRawName();
                 this.nullable = entry.isNullable();
+                this.errorCapable = entry.isErrorCapable();
                 this.type = entry.getType();
                 this.comment = entry.getComment();
                 this.elementSchema = entry.getElementSchema();
@@ -540,6 +563,12 @@ public Builder withNullable(final boolean nullable) {
                 return this;
             }
 
+            @Override
+            public Builder withErrorCapable(final boolean errorCapable) {
+                this.errorCapable = errorCapable;
+                return this;
+            }
+
             @Override
             public Builder withMetadata(final boolean metadata) {
                 this.metadata = metadata;
diff --git a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java
index dec6e7ceb3260..85e233722a835 100644
--- a/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java
+++ b/component-runtime-impl/src/test/java/org/talend/sdk/component/runtime/record/RecordBuilderImplTest.java
@@ -17,6 +17,7 @@
 
 import static java.util.stream.Collectors.joining;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -248,6 +249,98 @@ void dateTime() {
         assertThrows(IllegalArgumentException.class, () -> builder2.withDateTime("date", (ZonedDateTime) null));
     }
 
+    @Test
+    void withErrorWhenNotSupported() {
+        Assertions.assertThrows(IllegalArgumentException.class, () -> withError("false"));
+    }
+
+    @Test
+    void withError() {
+        Record record = withError("true");
+
+        assertFalse(record.isValid());
+
+        final Entry retrievedDateEntry = record.getSchema().getEntry("date");
+        assertNotNull(retrievedDateEntry);
+        Assertions.assertFalse(retrievedDateEntry.isValid());
+        assertEquals(
+                "Entry 'date' of type DATETIME is not compatible with given value of type 'java.lang.String': 'not a date'.",
+                retrievedDateEntry.getErrorMessage());
+        Assertions.assertNull(record.getDateTime("date"));
+
+        final Entry retrievedIntEntry = record.getSchema().getEntry("intValue");
+        assertNotNull(retrievedIntEntry);
+        Assertions.assertFalse(retrievedIntEntry.isValid());
+        assertEquals(
+                "Entry 'intValue' of type INT is not compatible with given value of type 'java.lang.String': 'wrong int value'.",
+                retrievedIntEntry.getErrorMessage());
+        Assertions.assertNull(record.getDateTime("intValue"));
+
+        final Entry retrievedStringEntry = record.getSchema().getEntry("normal");
+        assertNotNull(retrievedStringEntry);
+        Assertions.assertTrue(retrievedStringEntry.isValid());
+        Assertions.assertEquals("No error", record.getString("normal"));
+
+    }
+
+    private Record withError(final String supported) {
+        final String errorSupportBackup = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, supported);
+
+        Entry dateEntry = new EntryImpl.BuilderImpl()
+                .withName("date")
+                .withNullable(false)
+                .withErrorCapable(true)
+                .withType(Type.DATETIME)
+                .build();
+        Entry stringEntry = new EntryImpl.BuilderImpl()
+                .withName("normal")
+                .withNullable(true)
+                .withErrorCapable(true)
+                .withType(Type.STRING)
+                .build();
+        Entry intEntry = new EntryImpl.BuilderImpl()
+                .withName("intValue")
+                .withNullable(false)
+                .withErrorCapable(true)
+                .withType(Type.INT)
+                .build();
+        final Schema schema = new SchemaImpl.BuilderImpl()
+                .withType(Schema.Type.RECORD)
+                .withEntry(dateEntry)
+                .withEntry(stringEntry)
+                .withEntry(intEntry)
+                .build();
+
+        final RecordImpl.BuilderImpl builder = new RecordImpl.BuilderImpl(schema);
+
+        builder.with(stringEntry, "No error");
+        builder.with(dateEntry, "not a date");
+        builder.with(intEntry, "wrong int value");
+        final Record record = builder.build();
+
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, errorSupportBackup == null ? "false" : errorSupportBackup);
+
+        return record;
+    }
+
+    @Test
+    void testWithWrongEntryType() {
+        Entry entry = new SchemaImpl.EntryImpl.BuilderImpl()
+                .withName("date")
+                .withNullable(false)
+                .withType(Schema.Type.DATETIME)
+                .build();
+        final Schema schema = new SchemaImpl.BuilderImpl()
+                .withType(Schema.Type.RECORD)
+                .withEntry(entry)
+                .build();
+        final RecordImpl.BuilderImpl builder = new RecordImpl.BuilderImpl(schema);
+        assertNotNull(builder.getEntry("date"));
+
+        assertThrows(IllegalArgumentException.class, () -> builder.with(entry, "String"));
+    }
+
     @Test
     void zonedDateTimeVSInstant() {
         final Schema schema = new SchemaImpl.BuilderImpl()
diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java
index e357820eecc57..9233c5bdc82d4 100644
--- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java
+++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/ActionResourceImplTest.java
@@ -198,8 +198,10 @@ void checkSchemaSerialization() {
                 "{\n  \"entries\":[\n    {\n      \"elementSchema\":{\n        \"entries\":[\n        ],\n" +
                         "        \"metadata\":[\n        ],\n        \"props\":{\n\n        },\n        \"type\":\"STRING\"\n"
                         +
-                        "      },\n      \"metadata\":false,\n      \"name\":\"array\",\n      \"nullable\":false,\n" +
-                        "      \"props\":{\n\n      },\n      \"type\":\"ARRAY\"\n    }\n  ],\n  \"metadata\":[\n" +
+                        "      },\n      \"errorCapable\":false," +
+                        "\n      \"metadata\":false,\n      \"name\":\"array\",\n      \"nullable\":false,\n" +
+                        "      \"props\":{\n\n      },\n      \"type\":\"ARRAY\",\n" +
+                        "      \"valid\":true\n    }\n  ],\n  \"metadata\":[\n" +
                         "  ],\n  \"props\":{\n    \"talend.fields.order\":\"array\"\n  },\n  \"type\":\"RECORD\"\n}";
         assertEquals(expected, schema);
     }
@@ -238,7 +240,7 @@ void checkDiscoverProcessorSchema() {
                 }, APPLICATION_JSON_TYPE), JsonObject.class);
         assertNotNull(guessed);
         final String expected =
-                "{\"entries\":[{\"metadata\":false,\"name\":\"field1\",\"nullable\":false,\"props\":{},\"type\":\"STRING\"},{\"comment\":\"field2 comment\",\"metadata\":false,\"name\":\"field2\",\"nullable\":false,\"props\":{},\"type\":\"LONG\"},{\"metadata\":false,\"name\":\"V1\",\"nullable\":false,\"props\":{},\"type\":\"STRING\"},{\"metadata\":false,\"name\":\"driver\",\"nullable\":false,\"props\":{},\"type\":\"STRING\"}],\"metadata\":[],\"props\":{\"talend.fields.order\":\"field1,field2,V1,driver\"},\"type\":\"RECORD\"}";
+                "{\"entries\":[{\"errorCapable\":false,\"metadata\":false,\"name\":\"field1\",\"nullable\":false,\"props\":{},\"type\":\"STRING\",\"valid\":true},{\"comment\":\"field2 comment\",\"errorCapable\":false,\"metadata\":false,\"name\":\"field2\",\"nullable\":false,\"props\":{},\"type\":\"LONG\",\"valid\":true},{\"errorCapable\":false,\"metadata\":false,\"name\":\"V1\",\"nullable\":false,\"props\":{},\"type\":\"STRING\",\"valid\":true},{\"errorCapable\":false,\"metadata\":false,\"name\":\"driver\",\"nullable\":false,\"props\":{},\"type\":\"STRING\",\"valid\":true}],\"metadata\":[],\"props\":{\"talend.fields.order\":\"field1,field2,V1,driver\"},\"type\":\"RECORD\"}";
         assertEquals(expected, guessed.toString());
     }
 
diff --git a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java
index 553bfe64c4870..d4111f8379d3d 100644
--- a/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java
+++ b/component-server-parent/component-server/src/test/java/org/talend/sdk/component/server/front/beam/BeamActionSerializationTest.java
@@ -45,8 +45,10 @@ void checkSchemaSerialization() {
         final String attended = "{\n" + "  \"entries\":[\n" + "    {\n" + "      \"elementSchema\":{\n"
                 + "        \"entries\":[\n" + "        ],\n" + "        \"metadata\":[\n" + "        ],\n"
                 + "        \"props\":{\n" + "\n" + "        },\n" + "        \"type\":\"STRING\"\n" + "      },\n"
-                + "      \"metadata\":false,\n" + "      \"name\":\"array\",\n" + "      \"nullable\":false,\n"
-                + "      \"props\":{\n" + "\n" + "      },\n" + "      \"type\":\"ARRAY\"\n" + "    }\n" + "  ],\n"
+                + "      \"errorCapable\":false,\n      \"metadata\":false,\n"
+                + "      \"name\":\"array\",\n" + "      \"nullable\":false,\n"
+                + "      \"props\":{\n" + "\n" + "      },\n" + "      \"type\":\"ARRAY\",\n" +
+                "      \"valid\":true\n    }\n" + "  ],\n"
                 + "  \"metadata\":[\n" + "  ],\n" + "  \"props\":{\n" + "    \"talend.fields.order\":\"array\"\n"
                 + "  },\n" + "  \"type\":\"RECORD\"\n" + "}";
         assertEquals(attended, schema);
diff --git a/sample-parent/sample-features/entry-with-error/README.md b/sample-parent/sample-features/entry-with-error/README.md
new file mode 100644
index 0000000000000..dad382d0da918
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/README.md
@@ -0,0 +1,172 @@
+# Component Runtime :: Sample Feature :: Entry with error
+
+## Table of Contents
+- [Overview](#overview)
+- [Usage](#usage)
+  - [How to build the sample connector plugin](#how-to-build-the-sample-connector-plugin)
+  - [How to run](#how-to-run)
+  - [How to use](#how-to-use)
+- [Plugin artifact](#plugin-artifact)
+- [Execution examples](#execution-examples)
+  - [Run supporterror connector with default behavior](#run-checkpoint-connector-with-default-behavior)
+  - [Run with framework feature disabled](#run-with-framework-feature-disabled)
+
+
+## Overview
+This is a simple TCK connector plugin to test and validate the feature about improve record API to add error info for
+invalid entries.
+
+This project contains two things:
+ 1. A sample connector plugin that implements the entry-with-error feature.
+ 2. A simple Cli runner that can be used to run the connector plugin and test the entry-with-error feature.
+
+
+## Usage
+### How to build the sample connector plugin
+Checkout the code from the repository and build the project using `mvn clean install`  
+Alternatively build the feature module using `mvn install -am -pl :entrywitherror`
+
+### How to run
+To run the connector, you need exec the generated artifact `org.talend.sdk.component.sample.feature:entrywitherror`.  
+* You can run it directly from `target` folder or repository folder
+  * `java -jar target/entrywitherror-1.81.0-SNAPSHOT.jar `
+* or you can run it from the maven repository
+  * `java -jar  ~/.m2/repository/org/talend/sdk/component/sample/feature/entrywitherror/1.81.0-SNAPSHOT/entrywitherror-1.81.0-SNAPSHOT.jar`
+
+For later usage, will use the variable `$RUNCMD` as the way you may choose.  
+⚠️ If you're using jdk17, don't forget to add the `--add-opens` option to the command line
+(see profile _jdk9_ in master pom at the repository's root) or use instead jdk11.
+
+### How to use
+Run `entry-with-error` command:
+
+```bash
+$ $RUNCMD  entry-with-error
+
+Usage: entry-with-error [options]
+
+Options: 
+  --family=<String>              default: sampleRecordWithEntriesInError
+  --fields-in-error=<String>     default: age,date
+  --gav=<String>                 default: org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT
+  --gen-nb-records=<int>         default: 10
+  --how-many-errors=<int>        default: 0
+  --jar=<File>
+  --mapper=<String>              default: RecordWithEntriesInErrorEmitter
+  --support-entry-with-error
+  --use-avro-impl
+```
+
+## Plugin artifact
+There are two ways to run the entry-with-error runner with a specific plugin artifact:
+- Using the `--gav` option to specify the GAV of the plugin artifact.  
+    Syntax:  `groupId:artifactId:version[:packaging[:classifier]]`  
+
+- Using the `--jar` option to specify the path to the plugin artifact.  
+    Syntax:  `/path/to/plugin.jar`
+
+⚠️ You cannot use both options at the same time.
+
+## Execution examples
+### Run entry-with-error sample with default behavior
+To execute with legacy behavior, just don't add the `--support-entry-with-error` option. The command 
+`$RUNCMD entry-with-error --gen-nb-records=4` will use default parameters values. It will generate 10 records with 0 errors.
+
+```bash 
+Parameters:
+	gav: org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT
+	support-entry-with-error: false
+	use-avro-impl: false
+	how-many-errors: 0
+	gen-nb-records: 4
+	fields-in-error: age,date
+	jar: null
+	family: sampleRecordWithEntriesInError
+	mapper: RecordWithEntriesInErrorEmitter
+[INFO]  Manager is using plugin: entrywitherror from GAV org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT.
+[INFO]  configuration: {configuration.fieldsInError[0]=age, configuration.fieldsInError[1]=date, configuration.nbRecords=4, configuration.howManyErrors=0}
+-----------------------------------------------------
+Record (RecordImpl) no 1 is valid ? yes
+	Name: name 1
+	Date: 2025-04-02T15:30Z[UTC]
+	Age: 51
+-----------------------------------------------------
+Record (RecordImpl) no 2 is valid ? yes
+	Name: name 2
+	Date: 2025-04-03T15:30Z[UTC]
+	Age: 52
+-----------------------------------------------------
+Record (RecordImpl) no 3 is valid ? yes
+	Name: name 3
+	Date: 2025-04-04T15:30Z[UTC]
+	Age: 53
+-----------------------------------------------------
+Record (RecordImpl) no 4 is valid ? yes
+	Name: name 4
+	Date: 2025-04-05T15:30Z[UTC]
+	Age: 54
+-----------------------------------------------------
+[INFO]  finished.
+
+```
+The following command do the same, but an error is generated on the `age` attribute of the first record. So, an exception is raised:
+```bash
+$RUNCMD entry-with-error --gen-nb-records=4 --how-many-errors=1 --fields-in-error=age
+
+Parameters:
+        gav: org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT
+        support-entry-with-error: false                                                                                                                                                                                               use-avro-impl: false
+        how-many-errors: 1
+        gen-nb-records: 4                                                                                                                                                                                                             gfields-in-error: age
+        jar: null
+        family: sampleRecordWithEntriesInError
+        mapper: RecordWithEntriesInErrorEmitter
+[INFO]  Manager is using plugin: entrywitherror from GAV org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT.
+[INFO]  configuration: {configuration.fieldsInError[0]=age, configuration.nbRecords=4, configuration.howManyErrors=1}
+[EXCEPTION] Entry 'age' of type INT is not compatible with given value of type 'java.lang.String': '-78'.
+java.lang.IllegalArgumentException: Entry 'age' of type INT is not compatible with given value of type 'java.lang.String': '-78'.
+```
+
+### Run with entry-wit-error enable
+In this example we turn on the `entry-with-error` capability with the option `--support-entry-with-error`.
+
+```bash
+$RUNCMD entry-with-error --gen-nb-records=4 --how-many-errors=1 --fields-in-error=age --support-entry-with-error
+
+Parameters:
+        gav: org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT                                                                                                                                               support-entry-with-error: true
+        use-avro-impl: false
+        how-many-errors: 1                                                                                                                                                                                                            gen-nb-records: 4
+        gfields-in-error: age
+        jar: null
+        family: sampleRecordWithEntriesInError
+        mapper: RecordWithEntriesInErrorEmitter
+[INFO]  Manager is using plugin: entrywitherror from GAV org.talend.sdk.component.sample.feature:entrywitherror:jar:1.81.0-SNAPSHOT.
+[INFO]  configuration: {configuration.fieldsInError[0]=age, configuration.nbRecords=4, configuration.howManyErrors=1}
+-----------------------------------------------------
+Record (RecordImpl) no 1 is valid ? no
+        Name: name 1
+        Date: 2025-04-02T15:30Z[UTC]
+        Age is on error:
+                Value (should be null): null
+                Message:Entry 'age' of type INT is not compatible with given value of type 'java.lang.String': '-78'.
+                Fallback value: -78
+-----------------------------------------------------
+Record (RecordImpl) no 2 is valid ? yes
+        Name: name 2
+        Date: 2025-04-03T15:30Z[UTC]
+        Age: 52
+-----------------------------------------------------
+Record (RecordImpl) no 3 is valid ? yes
+        Name: name 3
+        Date: 2025-04-04T15:30Z[UTC]
+        Age: 53
+-----------------------------------------------------
+Record (RecordImpl) no 4 is valid ? yes
+        Name: name 4
+        Date: 2025-04-05T15:30Z[UTC]
+        Age: 54
+-----------------------------------------------------
+[INFO]  finished.
+```
+The first record is on error, bu, bo exception is raise and following records are well generated.
diff --git a/sample-parent/sample-features/entry-with-error/pom.xml b/sample-parent/sample-features/entry-with-error/pom.xml
new file mode 100644
index 0000000000000..dcccec81bae86
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/pom.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+   Licensed 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.talend.sdk.component</groupId>
+    <artifactId>sample-features</artifactId>
+    <version>1.81.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.talend.sdk.component.sample.feature</groupId>
+  <artifactId>entrywitherror</artifactId>
+  <packaging>jar</packaging>
+
+  <name>Component Runtime :: Sample Feature :: Entry with error support</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.talend.sdk.component</groupId>
+      <artifactId>component-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.talend.sdk.component</groupId>
+      <artifactId>component-runtime-manager</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.talend.sdk.component</groupId>
+      <artifactId>component-runtime-beam</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.avro</groupId>
+      <artifactId>avro</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.tomitribe</groupId>
+      <artifactId>tomitribe-crest</artifactId>
+      <version>0.32</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.talend.sdk.component</groupId>
+        <artifactId>talend-component-maven-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>talend-component-validate</id>
+            <goals>
+              <goal>validate</goal>
+            </goals>
+            <phase>process-classes</phase>
+            <configuration>
+              <validatePlaceholder>true</validatePlaceholder>
+              <validateSvg>true</validateSvg>
+              <validateLegacyIcons>false</validateLegacyIcons>
+              <validateFamily>true</validateFamily>
+              <validateSerializable>true</validateSerializable>
+              <validateInternationalization>true</validateInternationalization>
+              <validateModel>true</validateModel>
+              <validateMetadata>true</validateMetadata>
+              <validateComponent>true</validateComponent>
+              <validateDataStore>false</validateDataStore>
+              <!-- Don't want datastore... -->
+              <validateDataSet>false</validateDataSet>
+              <!-- ...nor dataset -->
+              <validateActions>true</validateActions>
+              <validateDocumentation>true</validateDocumentation>
+              <validateWording>true</validateWording>
+              <validateLayout>true</validateLayout>
+              <validateOptionNames>true</validateOptionNames>
+              <validateOutputConnection>true</validateOutputConnection>
+              <validateLocalConfiguration>true</validateLocalConfiguration>
+              <validateNoFinalOption>true</validateNoFinalOption>
+              <validateExceptions>true</validateExceptions>
+              <failOnValidateExceptions>true</failOnValidateExceptions>
+              <validateRecord>true</validateRecord>
+              <validateSchema>true</validateSchema>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <phase>package</phase>
+            <configuration>
+              <transformers>
+                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <mainClass>org.talend.sdk.component.sample.feature.entrywitherror.Cli</mainClass>
+                </transformer>
+              </transformers>
+              <filters>
+                <filter>
+                  <artifact>*:*</artifact>
+                  <excludes>
+                    <exclude>META-INF/*.SF</exclude>
+                    <exclude>META-INF/*.DSA</exclude>
+                    <exclude>META-INF/*.RSA</exclude>
+                  </excludes>
+                </filter>
+              </filters>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/sample-parent/sample-features/entry-with-error/src/main/java-templates/org/talend/sdk/component/sample/feature/entrywitherror/Versions.java b/sample-parent/sample-features/entry-with-error/src/main/java-templates/org/talend/sdk/component/sample/feature/entrywitherror/Versions.java
new file mode 100644
index 0000000000000..fef316911253f
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/java-templates/org/talend/sdk/component/sample/feature/entrywitherror/Versions.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+ *
+ * Licensed 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.talend.sdk.component.sample.feature.entrywitherror;
+
+public interface Versions {
+
+    String KIT_VERSION = "${project.version}";
+
+}
diff --git a/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/Cli.java b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/Cli.java
new file mode 100644
index 0000000000000..89c13e726bcda
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/Cli.java
@@ -0,0 +1,251 @@
+/**
+ * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+ *
+ * Licensed 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.talend.sdk.component.sample.feature.entrywitherror;
+
+import static java.util.Optional.ofNullable;
+import static lombok.AccessLevel.PRIVATE;
+import static org.talend.sdk.component.runtime.manager.ComponentManager.findM2;
+
+import java.io.File;
+import java.time.ZonedDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import org.apache.avro.generic.IndexedRecord;
+import org.talend.sdk.component.api.record.Record;
+import org.talend.sdk.component.api.record.Schema.Entry;
+import org.talend.sdk.component.api.service.record.RecordBuilderFactory;
+import org.talend.sdk.component.dependencies.maven.Artifact;
+import org.talend.sdk.component.dependencies.maven.MvnCoordinateToFileConverter;
+import org.talend.sdk.component.runtime.beam.spi.record.AvroRecord;
+import org.talend.sdk.component.runtime.beam.spi.record.KeysForAvroProperty;
+import org.talend.sdk.component.runtime.input.InputImpl;
+import org.talend.sdk.component.runtime.input.Mapper;
+import org.talend.sdk.component.runtime.manager.ComponentManager;
+import org.talend.sdk.component.runtime.record.RecordBuilderFactoryImpl;
+import org.talend.sdk.component.runtime.serialization.ContainerFinder;
+import org.talend.sdk.component.runtime.serialization.LightContainer;
+import org.tomitribe.crest.Main;
+import org.tomitribe.crest.api.Command;
+import org.tomitribe.crest.api.Default;
+import org.tomitribe.crest.api.Option;
+
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor(access = PRIVATE)
+public final class Cli {
+
+    static final String GAV = "org.talend.sdk.component.sample.feature:entrywitherror:jar:"
+            + Versions.KIT_VERSION;
+
+    @Command("entry-with-error")
+    public static void runInput(
+            @Option("gav") @Default(GAV) final String gav,
+            @Option("support-entry-with-error") @Default("false") final boolean supportEntryWithError,
+            @Option("use-avro-impl") @Default("false") final boolean useAvroImpl,
+            @Option("how-many-errors") @Default("0") final int howManyErrors,
+            @Option("gen-nb-records") @Default("10") final int nbRecords,
+            @Option("fields-in-error") @Default("age,date") final String fieldsInError,
+            @Option("jar") final File jar,
+            @Option("family") @Default("sampleRecordWithEntriesInError") final String family,
+            @Option("mapper") @Default("RecordWithEntriesInErrorEmitter") final String mapper) {
+
+        System.out.printf(
+                "Parameters:%n\tgav: %s%n\tsupport-entry-with-error: %s%n\tuse-avro-impl: %s%n\thow-many-errors: %d%n" +
+                        "\tgen-nb-records: %d%n\tfields-in-error: %s%n\tjar: %s%n\tfamily: %s%n\tmapper: %s%n",
+                gav, supportEntryWithError, useAvroImpl, howManyErrors, nbRecords, fieldsInError, jar, family, mapper);
+
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, String.valueOf(supportEntryWithError));
+        System.setProperty("talend.component.beam.record.factory.impl", useAvroImpl ? "avro" : "default");
+
+        Map<String, String> config = new HashMap<>();
+        config.put("configuration.howManyErrors", String.valueOf(howManyErrors));
+        config.put("configuration.nbRecords", String.valueOf(nbRecords));
+
+        String[] fields = fieldsInError.split(",");
+        for (int i = 0; i < fields.length; i++) {
+            config.put("configuration.fieldsInError[" + i + "]", fields[i]);
+        }
+
+        run(jar, gav, config, family, mapper, useAvroImpl);
+    }
+
+    private static void run(final File jar, final String gav, final Map<String, String> configuration,
+            final String family, final String mapper, final boolean avro) {
+        try (final ComponentManager manager = manager(jar, gav)) {
+            info("configuration: " + configuration);
+
+            // create the mapper
+            final Mapper mpr = manager.findMapper(family, mapper, 1, configuration)
+                    .orElseThrow(() -> new IllegalStateException(
+                            String.format("No mapper found for: %s/%s.", family, manager)));
+
+            List<Mapper> mappers = mpr.split(1);
+            Record data;
+
+            int count = 0;
+            for (Mapper currentMapper : mappers) {
+                final InputImpl input = InputImpl.class.cast(currentMapper.create());
+                input.start();
+                while ((data = (Record) input.next()) != null) {
+                    count++;
+                    recordOut(count, data, avro);
+                }
+                input.stop();
+            }
+
+            System.out.println("-----------------------------------------------------");
+            info("finished.");
+        } catch (Exception e) {
+            exception(e);
+        }
+    }
+
+    private static void recordOut(final int count, final Record aRecord, final boolean avro) {
+        System.out.println("-----------------------------------------------------");
+        System.out.printf("Record (%s) no %s is valid ? %s%n", aRecord.getClass().getSimpleName(), count,
+                aRecord.isValid() ? "yes" : "no");
+
+        Entry name = aRecord.getSchema().getEntry("name");
+        String nameValue = aRecord.getString("name");
+        if (name.isValid()) {
+            System.out.printf("\tName: %s%n", nameValue);
+        } else {
+            System.out.printf(
+                    "\tName is on error: %n\t\tValue (should be null): %s%n\t\tMessage:%s%n\t\tFallback value: %s%n",
+                    nameValue, name.getErrorMessage(), name.getErrorFallbackValue());
+        }
+
+        Entry date = aRecord.getSchema().getEntry("date");
+        ZonedDateTime dateValue = aRecord.getDateTime("date");
+        if (date.isValid()) {
+            System.out.printf("\tDate: %s%n", dateValue);
+        } else {
+            System.out.printf(
+                    "\tDate is on error: %n\t\tValue (should be null): %s%n\t\tMessage:%s%n\t\tFallback value: %s%n",
+                    dateValue, date.getErrorMessage(), date.getErrorFallbackValue());
+        }
+
+        Entry age = aRecord.getSchema().getEntry("age");
+        Integer ageValue = aRecord.get(Integer.class, "age");
+        if (age.isValid()) {
+            System.out.printf("\tAge: %s%n", ageValue);
+        } else {
+            System.out.printf(
+                    "\tAge is on error: %n\t\tValue (should be null): %s%n\t\tMessage:%s%n\t\tFallback value: %s%n",
+                    ageValue, age.getErrorMessage(), age.getErrorFallbackValue());
+        }
+
+        if (avro) {
+            IndexedRecord unwrap = ((AvroRecord) aRecord).unwrap(IndexedRecord.class);
+            System.out.printf("\tAvro IndexedRecord on error ? %s=%s%n", KeysForAvroProperty.RECORD_IN_ERROR,
+                    unwrap.getSchema().getProp(KeysForAvroProperty.RECORD_IN_ERROR));
+            System.out.println("\tAvro fields properties:");
+            unwrap.getSchema().getFields().stream().forEach(f -> {
+                String props = f.getObjectProps()
+                        .entrySet()
+                        .stream()
+                        .map(es -> "\t\t\t" + es.getKey() + " = " + es.getValue())
+                        .collect(Collectors.joining("\n"));
+                System.out.printf("\t\tField '%s', properties: %n%s%n", f.name(), props);
+            });
+        }
+
+    }
+
+    public static void main(final String[] args) throws Exception {
+        ofNullable(run(args)).ifPresent(System.out::println);
+    }
+
+    public static Object run(final String[] args) throws Exception {
+        return new Main(Cli.class).exec(args);
+    }
+
+    static final String EXCEPTION = "[EXCEPTION] ";
+
+    static final String INFO = "[INFO]  ";
+
+    static MvnCoordinateToFileConverter mvnCoordinateToFileConverter = new MvnCoordinateToFileConverter();
+
+    public static ComponentManager manager(final File jar, final String artifact) {
+        return new ComponentManager(findM2()) {
+
+            final ComponentManager originalMgr = contextualInstance().get();
+
+            {
+                contextualInstance().set(this);
+                String containerId;
+                if (jar != null) {
+                    containerId = addPlugin(jar.getAbsolutePath());
+                    Cli.info(String.format("Manager is using plugin %s from %s.", containerId, jar));
+                } else {
+                    final String pluginPath = ofNullable(artifact)
+                            .map(gav -> mvnCoordinateToFileConverter.toArtifact(gav))
+                            .map(Artifact::toPath)
+                            .orElseThrow(() -> new IllegalArgumentException("Plugin GAV can't be empty"));
+                    String p = findM2().resolve(pluginPath).toAbsolutePath().toString();
+                    containerId = addPlugin(p);
+                    Cli.info(String.format("Manager is using plugin: %s from GAV %s.", containerId, artifact));
+                }
+                DynamicContainerFinder.SERVICES.put(RecordBuilderFactory.class,
+                        new RecordBuilderFactoryImpl(containerId));
+            }
+
+            @Override
+            public void close() {
+                DynamicContainerFinder.SERVICES.clear();
+                super.close();
+                contextualInstance().set(originalMgr);
+            }
+        };
+    }
+
+    public static class DynamicContainerFinder implements ContainerFinder {
+
+        static final Map<String, ClassLoader> LOADERS = new ConcurrentHashMap<>();
+
+        static final Map<Class<?>, Object> SERVICES = new ConcurrentHashMap<>();
+
+        @Override
+        public LightContainer find(final String plugin) {
+            return new LightContainer() {
+
+                @Override
+                public ClassLoader classloader() {
+                    return LOADERS.get(plugin);
+                }
+
+                @Override
+                public <T> T findService(final Class<T> key) {
+                    return key.cast(SERVICES.get(key));
+                }
+            };
+        }
+    }
+
+    public static void info(final String message) {
+        System.out.println(INFO + message);
+    }
+
+    public static void exception(final Throwable e) {
+        System.err.printf("%s%s%n%s%n", EXCEPTION, e.getMessage(), e);
+        System.exit(501);
+    }
+
+}
diff --git a/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java
new file mode 100644
index 0000000000000..e6fc5b30ed418
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/RecordWithEntriesInErrorEmitter.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+ *
+ * Licensed 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.talend.sdk.component.sample.feature.entrywitherror;
+
+import java.io.Serializable;
+import java.time.Month;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+import javax.annotation.PostConstruct;
+
+import org.talend.sdk.component.api.component.Icon;
+import org.talend.sdk.component.api.component.Version;
+import org.talend.sdk.component.api.configuration.Option;
+import org.talend.sdk.component.api.configuration.ui.layout.GridLayout;
+import org.talend.sdk.component.api.input.Emitter;
+import org.talend.sdk.component.api.input.Producer;
+import org.talend.sdk.component.api.meta.Documentation;
+import org.talend.sdk.component.api.record.Record;
+import org.talend.sdk.component.api.record.Record.Builder;
+import org.talend.sdk.component.api.record.Schema;
+import org.talend.sdk.component.api.record.Schema.Entry;
+import org.talend.sdk.component.api.service.record.RecordBuilderFactory;
+
+import lombok.Data;
+
+@Version
+@Icon(value = Icon.IconType.CUSTOM, custom = "icon")
+@Emitter(name = "RecordWithEntriesInErrorEmitter")
+@Documentation("Generated record with entries in error.")
+public class RecordWithEntriesInErrorEmitter implements Serializable {
+
+    private final RecordBuilderFactory recordBuilderFactory;
+
+    private final Config config;
+
+    private transient Function<Integer, Record> createRecordFunction;
+
+    private transient int index;
+
+    public RecordWithEntriesInErrorEmitter(
+            final RecordBuilderFactory recordBuilderFactory,
+            final @Option("configuration") Config config) {
+        this.recordBuilderFactory = recordBuilderFactory;
+        this.config = config;
+    }
+
+    @PostConstruct
+    public void init() {
+        final Schema recordSchema = recordBuilderFactory.newSchemaBuilder(Schema.Type.RECORD)
+                .withEntry(recordBuilderFactory.newEntryBuilder()
+                        .withName("name")
+                        .withNullable(false)
+                        .withErrorCapable(true)
+                        .withType(Schema.Type.STRING)
+                        .build())
+                .withEntry(recordBuilderFactory.newEntryBuilder()
+                        .withName("date")
+                        .withNullable(false)
+                        .withErrorCapable(true)
+                        .withType(Schema.Type.DATETIME)
+                        .build())
+                .withEntry(recordBuilderFactory.newEntryBuilder()
+                        .withName("age")
+                        .withNullable(false)
+                        .withErrorCapable(true)
+                        .withType(Schema.Type.INT)
+                        .build())
+                .build();
+
+        createRecordFunction = i -> {
+            Builder builder = recordBuilderFactory.newRecordBuilder(recordSchema);
+
+            boolean generateErrors = config.getHowManyErrors() >= i;
+
+            if (generateErrors && config.getFieldsInError().contains("name")) {
+                Entry nameEntry = recordSchema.getEntry("name");
+                builder.with(nameEntry, null);
+            } else {
+                builder.withString("name", "name " + i);
+            }
+
+            if (generateErrors && config.getFieldsInError().contains("date")) {
+                Entry dateEntry = recordSchema.getEntry("date");
+                builder.with(dateEntry, "789-555");
+            } else {
+                ZonedDateTime dateTime = ZonedDateTime.of(
+                        2025, // Year
+                        Month.APRIL.getValue(), // Month
+                        1 + i, // Day
+                        15, // Hours
+                        30, // Minutes
+                        0, // seconds
+                        0, // nanoseconds
+                        ZoneId.of("UTC") // Timezone
+                );
+                builder.withDateTime("date", dateTime);
+            }
+
+            if (generateErrors && config.getFieldsInError().contains("age")) {
+                Entry ageEntry = recordSchema.getEntry("age");
+                builder.with(ageEntry, "-78");
+            } else {
+                builder.withInt("age", 50 + i);
+            }
+
+            return builder.build();
+        };
+    }
+
+    @Producer
+    public Record data() {
+        index++;
+        if (index <= config.getNbRecords()) {
+            return createRecordFunction.apply(index);
+        }
+
+        return null;
+    }
+
+    @Data
+    @GridLayout(value = {
+            @GridLayout.Row("howManyErrors"),
+            @GridLayout.Row("nbRecords"),
+            @GridLayout.Row("fieldsInError"),
+    })
+    public static class Config implements Serializable {
+
+        @Option
+        @Documentation("The number of errors to generate..")
+        private int howManyErrors;
+
+        @Option
+        @Documentation("Number of generated records.")
+        private int nbRecords = 5;
+
+        @Option
+        @Documentation("Fields in error.")
+        private List<String> fieldsInError = new ArrayList<>();
+
+    }
+
+}
diff --git a/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/package-info.java b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/package-info.java
new file mode 100644
index 0000000000000..0668f6bcaa05c
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/java/org/talend/sdk/component/sample/feature/entrywitherror/package-info.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+ *
+ * Licensed 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.
+ */
+@Components(family = "sampleRecordWithEntriesInError", categories = "sample")
+@Icon(value = Icon.IconType.CUSTOM, custom = "icon")
+package org.talend.sdk.component.sample.feature.entrywitherror;
+
+import org.talend.sdk.component.api.component.Components;
+import org.talend.sdk.component.api.component.Icon;
diff --git a/sample-parent/sample-features/entry-with-error/src/main/resources/META-INF/services/org.talend.sdk.component.runtime.serialization.ContainerFinder b/sample-parent/sample-features/entry-with-error/src/main/resources/META-INF/services/org.talend.sdk.component.runtime.serialization.ContainerFinder
new file mode 100644
index 0000000000000..0d23def70f392
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/resources/META-INF/services/org.talend.sdk.component.runtime.serialization.ContainerFinder
@@ -0,0 +1 @@
+org.talend.sdk.component.runtime.manager.finder.StandaloneContainerFinder
diff --git a/sample-parent/sample-features/entry-with-error/src/main/resources/icons/dark/icon.svg b/sample-parent/sample-features/entry-with-error/src/main/resources/icons/dark/icon.svg
new file mode 100644
index 0000000000000..7932a76568dae
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/resources/icons/dark/icon.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <rect x="0.375" y="0.665" width="15.063" height="13.376" style="fill: rgb(255, 255, 255);"/>
+  <text style="fill: rgb(51, 51, 51); font-family: Arial, sans-serif; font-size: 2.55556px; font-weight: 700; line-height: 5.17751px; text-anchor: middle; white-space: pre;" transform="matrix(1.211007, 0, 0.029195, 2.152172, 3.935322, -2.805911)"><tspan x="3.067" y="4.345">Entry</tspan><tspan x="3.067" dy="1em">​</tspan><tspan>with error</tspan></text>
+</svg>
\ No newline at end of file
diff --git a/sample-parent/sample-features/entry-with-error/src/main/resources/icons/light/icon.svg b/sample-parent/sample-features/entry-with-error/src/main/resources/icons/light/icon.svg
new file mode 100644
index 0000000000000..7932a76568dae
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/resources/icons/light/icon.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+  <rect x="0.375" y="0.665" width="15.063" height="13.376" style="fill: rgb(255, 255, 255);"/>
+  <text style="fill: rgb(51, 51, 51); font-family: Arial, sans-serif; font-size: 2.55556px; font-weight: 700; line-height: 5.17751px; text-anchor: middle; white-space: pre;" transform="matrix(1.211007, 0, 0.029195, 2.152172, 3.935322, -2.805911)"><tspan x="3.067" y="4.345">Entry</tspan><tspan x="3.067" dy="1em">​</tspan><tspan>with error</tspan></text>
+</svg>
\ No newline at end of file
diff --git a/sample-parent/sample-features/entry-with-error/src/main/resources/org/talend/sdk/component/sample/feature/entrywitherror/Messages.properties b/sample-parent/sample-features/entry-with-error/src/main/resources/org/talend/sdk/component/sample/feature/entrywitherror/Messages.properties
new file mode 100644
index 0000000000000..37eaf22a94654
--- /dev/null
+++ b/sample-parent/sample-features/entry-with-error/src/main/resources/org/talend/sdk/component/sample/feature/entrywitherror/Messages.properties
@@ -0,0 +1,21 @@
+#  Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+#
+#  Licensed 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.
+# Here you can change all your configuration display names to use more explicit labels
+# You can also translate your configuration by adding one file by local Messages_fr.properties for french for example
+sampleRecordWithEntriesInError.RecordWithEntriesInErrorEmitter._displayName = Record with entries in error emitter
+Config.howManyErrors._displayName = Number of errors to generate
+Config.howManyErrors._placeholder =
+Config.nbRecords._displayName = Nb generated records
+Config.nbRecords._placeholder =
+Config.fieldsInError._displayName = Fields in error
\ No newline at end of file
diff --git a/sample-parent/sample-features/pom.xml b/sample-parent/sample-features/pom.xml
index 3214d3ab785d6..4b0d77c93bc41 100644
--- a/sample-parent/sample-features/pom.xml
+++ b/sample-parent/sample-features/pom.xml
@@ -32,6 +32,7 @@
     <module>aftergroup-lastgroup</module>
     <module>conditional-outputs</module>
     <module>checkpoint-runner</module>
+    <module>entry-with-error</module>
   </modules>
 
   <dependencies>


Reviews:
user: login: undx
body: As said in comments, I think that errors should be handled at record level not schema one.
The workflow expects that checking for bad values is done outside the framework.
Maybe, we could handle rather in it?

Another lead may be : 
- define rules for bad data handling in schema
- use the usual `withType` in Record. (checking is done here as for null values handling).
wdyt?


state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-09T09:08:07Z
user: login: yyin-talend
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T09:42:09Z
user: login: undx
body: lgtm
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-05-15T14:03:31Z
user: login: undx
state: DISMISSED
author_association: MEMBER
submitted_at: 2025-05-16T13:18:32Z
user: login: undx
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-16T13:39:10Z

Review comments:
diff_hunk: @@ -34,6 +34,8 @@
 
 public interface Record {
 
+    String RECORD_ERROR_SUPPORT = "talend.sdk.runtime.record.error.support";
path: component-api/src/main/java/org/talend/sdk/component/api/record/Record.java
user: login: undx
body: Usage in framework is to use `talend.component.` as a prefix for system properties.
created_at: 2025-05-09T08:16:24Z
author_association: MEMBER
diff_hunk: @@ -311,6 +313,11 @@ default Optional<Record> getOptionalRecord(final String name) {
         return ofNullable(get(Record.class, name));
     }
 
+    default boolean isValid() {
+        return !getSchema().getAllEntries()
+                .anyMatch(entry -> !entry.isValid());
path: component-api/src/main/java/org/talend/sdk/component/api/record/Record.java
user: login: undx
body: See sonar comment, more easy to read that double negation.
created_at: 2025-05-09T08:17:43Z
author_association: MEMBER
diff_hunk: @@ -37,6 +37,14 @@ public interface SchemaProperty {
 
     String ALLOW_SPECIAL_NAME = "field.special.name";
 
+    String ENTRY_IS_ON_ERROR = "entry.on.error";
+
+    String ENTRY_ERROR_MESSAGE = "entry.error.message";
+
+    String ENTRY_ERROR_FALLBACK_VALUE = "entry.error.fallback.value";
+
+    String ERROR_EXCEPTION = "entry.error.exception";
path: component-api/src/main/java/org/talend/sdk/component/api/record/SchemaProperty.java
user: login: undx
body: see my previous comment. Maybe smtg like `record.value.`
created_at: 2025-05-09T08:28:53Z
author_association: MEMBER
diff_hunk: @@ -232,6 +232,11 @@ interface Entry {
          */
         boolean isMetadata();
 
+        /**
+          * @return true if the value of this entry is valid; false for invalid value.
+         */
+        boolean isValid();
path: component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java
user: login: undx
body: Can also add a `default` behavior as returning `true`...
created_at: 2025-05-09T08:30:03Z
author_association: MEMBER
diff_hunk: @@ -163,6 +163,10 @@ public String getProp(final String property) {
         public Builder toBuilder() {
             throw new UnsupportedOperationException("#toBuilder()");
         }
+
+        @Override
+        public boolean isValid() { return true; }
path: component-api/src/main/java/org/talend/sdk/component/api/service/schema/Schema.java
user: login: undx
body: See previous comments...
created_at: 2025-05-09T08:30:48Z
author_association: MEMBER
diff_hunk: @@ -135,6 +135,9 @@ public Map<String, String> getProps() {
             public String getProp(String property) {
                 return null;
             }
+
+            @Override
+            public boolean isValid() { return true; }
path: component-api/src/test/java/org/talend/sdk/component/api/record/RecordTest.java
user: login: undx
body: See previous comments...
created_at: 2025-05-09T08:30:54Z
author_association: MEMBER
diff_hunk: @@ -326,6 +326,9 @@ public JsonValue getJsonProp(final String name) {
             return Entry.super.getJsonProp(name);
         }
 
+        @Override
+        public boolean isValid() { return true; }
path: component-api/src/test/java/org/talend/sdk/component/api/record/SchemaTest.java
user: login: undx
body: See previous comments...
created_at: 2025-05-09T08:31:03Z
author_association: MEMBER
diff_hunk: @@ -102,6 +102,9 @@ public String getProp(final String property) {
         public Builder toBuilder() {
             throw new UnsupportedOperationException("#toBuilder()");
         }
+
+        @Override
+        public boolean isValid() { return true; }
path: component-api/src/test/java/org/talend/sdk/component/api/service/record/RecordBuilderFactoryTest.java
user: login: undx
body: See previous comments...
created_at: 2025-05-09T08:31:10Z
author_association: MEMBER
diff_hunk: @@ -209,6 +209,53 @@ void mixedRecordTest() {
         Assertions.assertNotNull(arrayType);
     }
 
+    @Test
+    void testWithError() {
+        final String val = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, "true");
+        final String val2 = System.getProperty(Record.RECORD_ERROR_SUPPORT);
path: component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java
user: login: undx
body: You can use the before and after annotations to handle this...
created_at: 2025-05-09T08:32:53Z
author_association: MEMBER
diff_hunk: @@ -209,6 +209,53 @@ void mixedRecordTest() {
         Assertions.assertNotNull(arrayType);
     }
 
+    @Test
+    void testWithError() {
+        final String val = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, "true");
+        final String val2 = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+
+        org.talend.sdk.component.api.record.Schema.Builder schemaBuilder = factory.newSchemaBuilder(Schema.Type.RECORD);
+        Schema.Entry nameEntry = factory
+                .newEntryBuilder()
+                .withName("name")
+                .withNullable(false)
+                .withType(Schema.Type.STRING)
+                .build();
+        Schema.Entry nmEntry = factory
+                .newEntryBuilder()
+                .withName("normal")
+                .withNullable(true)
+                .withType(Schema.Type.STRING)
+                .build();
+        Schema.Entry ageEntry = factory
+                .newEntryBuilder()
+                .withName("age")
+                .withNullable(false)
+                .withType(Schema.Type.INT)
+                .build();
+        Schema customerSchema = schemaBuilder.withEntry(nameEntry).withEntry(nmEntry).withEntry(ageEntry).build();
+        // record 1
+        Record.Builder recordBuilder = factory.newRecordBuilder(customerSchema);
+        Record record1 = recordBuilder.withError("name", null, "Stirng is null", null)
+                .withString("normal", "normal")
+                .withError("age", "string", "is not an int", null)
+                .build();
+        assertFalse(record1.isValid());
+
+        final Schema.Entry entry =
+                record1.getSchema().getEntries().stream().filter(e -> "name".equals(e.getName())).findAny().get();
+        assertNotNull(entry);
+        Assertions.assertFalse(entry.isValid());
+
+        final Schema.Entry entry2 =
+                record1.getSchema().getEntries().stream().filter(e -> "age".equals(e.getName())).findAny().get();
+        assertNotNull(entry2);
+        Assertions.assertFalse(entry2.isValid());
+
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, "false");
path: component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java
user: login: undx
body: You can use the before and after annotations to handle this...
created_at: 2025-05-09T08:32:59Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,60 @@
+/**
+ * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+ *
+ * Licensed 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.talend.sdk.component.sample.feature.supporterror;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+
+import org.talend.sdk.component.api.component.Icon;
+import org.talend.sdk.component.api.component.Version;
+import org.talend.sdk.component.api.configuration.Option;
+import org.talend.sdk.component.api.input.Assessor;
+import org.talend.sdk.component.api.input.Emitter;
+import org.talend.sdk.component.api.input.PartitionMapper;
+import org.talend.sdk.component.api.input.PartitionSize;
+import org.talend.sdk.component.api.input.Split;
+import org.talend.sdk.component.api.meta.Documentation;
+
+@Version(1)
+@Icon(value = Icon.IconType.CUSTOM, custom = "mapper")
+@PartitionMapper(name = "SupportErrorMapper", infinite = false)
+@Documentation("Doc: default SupportErrorMapper documentation without Internationalization.")
+public class SupportErrorMapper implements Serializable {
+
+    private transient SupportErrorInput.InputConfig config;
+
+    public SupportErrorMapper(final @Option("configin") SupportErrorInput.InputConfig config) {
+        this.config = config;
+    }
+
+    @Assessor
+    public long estimateSize() {
+        return 1500L;
+    }
+
+    @Split
+    public List<SupportErrorMapper> split(@PartitionSize final int desiredNbSplits) {
+        return Collections.singletonList(this);
+    }
+
+    @Emitter
+    public SupportErrorInput createSource() {
+
path: sample-parent/sample-features/supporterror/src/main/java/org/talend/sdk/component/sample/feature/supporterror/SupportErrorMapper.java
user: login: undx
body: empty line, applied formater?
created_at: 2025-05-09T08:48:41Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,127 @@
+/**
+ * Copyright (C) 2006-2025 Talend Inc. - www.talend.com
+ *
+ * Licensed 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.talend.sdk.component.sample.feature.supporterror;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.annotation.PostConstruct;
+
+import org.talend.sdk.component.api.component.Icon;
+import org.talend.sdk.component.api.component.Version;
+import org.talend.sdk.component.api.configuration.Option;
+import org.talend.sdk.component.api.configuration.type.DataSet;
+import org.talend.sdk.component.api.configuration.type.DataStore;
+import org.talend.sdk.component.api.configuration.ui.layout.GridLayout;
+import org.talend.sdk.component.api.input.Emitter;
+import org.talend.sdk.component.api.input.Producer;
+import org.talend.sdk.component.api.meta.Documentation;
+import org.talend.sdk.component.api.record.Record;
+import org.talend.sdk.component.api.record.Schema;
+import org.talend.sdk.component.runtime.record.RecordImpl;
+import org.talend.sdk.component.runtime.record.SchemaImpl;
+
+import lombok.Data;
+
+@Version
+@Icon(value = Icon.IconType.CUSTOM, custom = "icon")
+@Documentation("Support Error Input sample processor connector.")
+@Emitter(family = "supporterror", name = "supportErrorInput")
+public class SupportErrorInput implements Serializable {
+
+
+    private transient Schema recordSchema;
+
+    private final transient InputConfig configuration;
+
+    public SupportErrorInput(@Option("configuration") final InputConfig config) {
+        this.configuration = config;
+    }
+
+    @PostConstruct
+    public void init() {
+        recordSchema = new SchemaImpl.BuilderImpl()
+                .withType(Schema.Type.RECORD)
+                .withEntry(new SchemaImpl.EntryImpl.BuilderImpl()
+                        .withName("name")
+                        .withNullable(false)
+                        .withType(Schema.Type.STRING)
+                        .build())
+                .withEntry(new SchemaImpl.EntryImpl.BuilderImpl()
+                        .withName("date")
+                        .withNullable(false)
+                        .withType(Schema.Type.DATETIME)
+                        .build())
+                .withEntry(new SchemaImpl.EntryImpl.BuilderImpl()
+                        .withName("age")
+                        .withNullable(false)
+                        .withType(Schema.Type.INT)
+                        .build())
+                .build();
+    }
+
+    @Producer
+    public Record data() {
+        final RecordImpl.BuilderImpl builder = new RecordImpl.BuilderImpl(recordSchema);
+        return builder.withString("name", "example connector")
+                .withError("date", null, "date is null", null)
+                .withError("age", "string", "wrong int value", null)
+                .build();
+    }
+
+    @Data
+    @GridLayout(value = {
+            @GridLayout.Row("dataset"),
+    })
+     @Version
path: sample-parent/sample-features/supporterror/src/main/java/org/talend/sdk/component/sample/feature/supporterror/SupportErrorInput.java
user: login: undx
body: indentation
created_at: 2025-05-09T08:49:54Z
author_association: MEMBER
diff_hunk: @@ -209,6 +209,53 @@ void mixedRecordTest() {
         Assertions.assertNotNull(arrayType);
     }
 
+    @Test
+    void testWithError() {
+        final String val = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+        System.setProperty(Record.RECORD_ERROR_SUPPORT, "true");
+        final String val2 = System.getProperty(Record.RECORD_ERROR_SUPPORT);
+
+        org.talend.sdk.component.api.record.Schema.Builder schemaBuilder = factory.newSchemaBuilder(Schema.Type.RECORD);
+        Schema.Entry nameEntry = factory
+                .newEntryBuilder()
+                .withName("name")
+                .withNullable(false)
+                .withType(Schema.Type.STRING)
+                .build();
+        Schema.Entry nmEntry = factory
+                .newEntryBuilder()
+                .withName("normal")
+                .withNullable(true)
+                .withType(Schema.Type.STRING)
+                .build();
+        Schema.Entry ageEntry = factory
+                .newEntryBuilder()
+                .withName("age")
+                .withNullable(false)
+                .withType(Schema.Type.INT)
+                .build();
+        Schema customerSchema = schemaBuilder.withEntry(nameEntry).withEntry(nmEntry).withEntry(ageEntry).build();
+        // record 1
+        Record.Builder recordBuilder = factory.newRecordBuilder(customerSchema);
+        Record record1 = recordBuilder.withError("name", null, "Stirng is null", null)
+                .withString("normal", "normal")
+                .withError("age", "string", "is not an int", null)
+                .build();
+        assertFalse(record1.isValid());
+
+        final Schema.Entry entry =
+                record1.getSchema().getEntries().stream().filter(e -> "name".equals(e.getName())).findAny().get();
+        assertNotNull(entry);
+        Assertions.assertFalse(entry.isValid());
+
+        final Schema.Entry entry2 =
+                record1.getSchema().getEntries().stream().filter(e -> "age".equals(e.getName())).findAny().get();
+        assertNotNull(entry2);
+        Assertions.assertFalse(entry2.isValid());
path: component-runtime-beam/src/test/java/org/talend/sdk/component/runtime/beam/spi/record/AvroRecordBuilderTest.java
user: login: undx
body: Here, we're testing the Record/Schema implementations, not the Avro related.
created_at: 2025-05-09T08:59:04Z
author_association: MEMBER
diff_hunk: @@ -513,6 +514,28 @@ public <T> Builder withArray(final Schema.Entry entry, final Collection<T> value
             return append(entry, values);
         }
 
+        @Override
+        public Builder withError(final String columnName, final Object value, final String errorMessage,
+                final Exception exception) {
+            final boolean supportError = Boolean.parseBoolean(System.getProperty(RECORD_ERROR_SUPPORT, "false"));
+            if (!supportError) {
+                throw new IllegalArgumentException(errorMessage);
+            } else {
+                // duplicate the schema instance with a modified Entry
+                final Entry oldEntry = this.findExistingEntry(columnName);
+                final Entry updateEntry = oldEntry.toBuilder()
+                        .withName(columnName)
+                        .withNullable(true)
+                        .withType(oldEntry.getType())
+                        .withProp(SchemaProperty.ENTRY_IS_ON_ERROR, "true")
+                        .withProp(SchemaProperty.ENTRY_ERROR_MESSAGE, errorMessage)
+                        .withProp(SchemaProperty.ENTRY_ERROR_FALLBACK_VALUE, String.valueOf(value))
+                        .withProp(SchemaProperty.ERROR_EXCEPTION, exception == null ? "" : exception.toString())
+                        .build();
+                return updateEntryByName(columnName, updateEntry);
path: component-runtime-impl/src/main/java/org/talend/sdk/component/runtime/record/RecordImpl.java
user: login: undx
body: This intent expects that value is always in error.
created_at: 2025-05-09T09:02:31Z
author_association: MEMBER
diff_hunk: @@ -232,6 +232,11 @@ interface Entry {
          */
         boolean isMetadata();
 
+        /**
+          * @return true if the value of this entry is valid; false for invalid value.
+         */
+        boolean isValid();
path: component-api/src/main/java/org/talend/sdk/component/api/record/Schema.java
user: login: yyin-talend
body: It is not using schema, but using Entry. 
created_at: 2025-05-09T09:42:09Z
author_association: CONTRIBUTOR

PR comments:
user: login: sonar-eks[bot]
created_at: 2025-05-08T06:37:54Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- C Reliability Rating on New Code (is worse than A)
- 6.95% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 22 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 1 Bug
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 21 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 80.00% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/10.svg?sanitize=true) 6.95% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-08T07:57:04Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- 78.80% Coverage on New Code (is less than 80.00%)
- 4.47% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 8 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 8 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 78.80% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/5.svg?sanitize=true) 4.47% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-08T08:01:54Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- 78.80% Coverage on New Code (is less than 80.00%)
- 4.56% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 7 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 7 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 78.80% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/5.svg?sanitize=true) 4.56% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-09T05:43:45Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- 78.80% Coverage on New Code (is less than 80.00%)
- 4.56% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 7 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 7 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 78.80% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/5.svg?sanitize=true) 4.56% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: undx
created_at: 2025-05-09T14:34:45Z
body: Discussed with Yves and forget my comments on Schema level vs Record Level.
Removing my comments for clarity.
author_association: MEMBER
user: login: sonar-eks[bot]
created_at: 2025-05-12T07:30:41Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- 4.34% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 6 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 6 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 87.90% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/5.svg?sanitize=true) 4.34% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-12T08:31:19Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- 4.26% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 6 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 6 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 85.70% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/5.svg?sanitize=true) 4.26% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-15T09:18:33Z
body: ![Failed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/failed.svg?sanitize=true)

- 3.29% Duplicated Lines (%) on New Code (is greater than 3.00%)

# Analysis Details
## 21 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 21 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 90.90% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/5.svg?sanitize=true) 3.29% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-15T12:57:51Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 21 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 21 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 90.90% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.75% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-15T13:11:46Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 2 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 2 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 90.90% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.75% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-15T14:01:39Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 0 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 0 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 90.90% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.76% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-15T15:30:41Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 0 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 0 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/60.svg?sanitize=true) 81.80% Coverage (54.20% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.76% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-16T12:00:03Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 1 Issue
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 1 Code Smell

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 93.80% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.74% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-16T12:38:20Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 1 Issue
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 1 Code Smell

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 92.00% Coverage (56.50% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.73% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE
user: login: sonar-eks[bot]
created_at: 2025-05-16T13:52:23Z
body: ![Passed](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/QualityGateBadge/passed.svg?sanitize=true)

# Analysis Details
## 3 Issues
- ![Bug](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/bug.svg?sanitize=true) 0 Bugs
- ![Vulnerability](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/vulnerability.svg?sanitize=true) 0 Vulnerabilities
- ![Code Smell](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/common/code_smell.svg?sanitize=true) 3 Code Smells

## Coverage and Duplications
- ![Coverage](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/CoverageChart/90.svg?sanitize=true) 92.00% Coverage (56.40% Estimated after merge)
- ![Duplications](https://raw.githubusercontent.com/mc1arke/sonarqube-community-branch-plugin/master/src/main/resources/static/checks/Duplications/3.svg?sanitize=true) 2.69% Duplicated Code (1.40% Estimated after merge)

**Project ID:** org.talend.sdk.component:component-runtime

[View in SonarQube](https://sonar-eks.datapwn.com/dashboard?id=org.talend.sdk.component%3Acomponent-runtime&pullRequest=1041)


author_association: NONE