{"record":{"id":"a11e8da75ca14e71","repo":"apache/seatunnel","slug":"unsupported-operation-a11e8d","errorCode":"UNSUPPORTED_OPERATION","errorMessage":"error fieldName=%s,fieldValue=%s,seaTunnelDataType=%s,rowRecord=%s","messagePattern":"error fieldName=(.+?),fieldValue=(.+?),seaTunnelDataType=(.+?),rowRecord=(.+?)","errorType":"error_code","errorClass":"EasysearchConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-easysearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/easysearch/serialize/source/DefaultSeaTunnelRowDeserializer.java","lineNumber":129,"sourceCode":"        SeaTunnelDataType seaTunnelDataType = null;\n        try {\n            for (int i = 0; i < rowTypeInfo.getTotalFields(); i++) {\n                fieldName = rowTypeInfo.getFieldName(i);\n                value = recursiveGet(rowRecord.getDoc(), fieldName);\n                if (value != null) {\n                    seaTunnelDataType = rowTypeInfo.getFieldType(i);\n                    if (value instanceof NullNode) {\n                        seaTunnelFields[i] = null;\n                    } else if (value instanceof TextNode) {\n                        seaTunnelFields[i] =\n                                convertValue(seaTunnelDataType, ((TextNode) value).textValue());\n                    } else {\n                        seaTunnelFields[i] = convertValue(seaTunnelDataType, value.toString());\n                    }\n                }\n            }\n        } catch (Exception ex) {\n            throw new EasysearchConnectorException(\n                    UNSUPPORTED_OPERATION,\n                    String.format(\n                            \"error fieldName=%s,fieldValue=%s,seaTunnelDataType=%s,rowRecord=%s\",\n                            fieldName, value, seaTunnelDataType, JsonUtils.toJsonString(rowRecord)),\n                    ex);\n        }\n        return new SeaTunnelRow(seaTunnelFields);\n    }\n\n    Object convertValue(SeaTunnelDataType<?> fieldType, String fieldValue)\n            throws JsonProcessingException {\n        if (BOOLEAN_TYPE.equals(fieldType)) {\n            return Boolean.parseBoolean(fieldValue);\n        } else if (BYTE_TYPE.equals(fieldType)) {\n            return Byte.valueOf(fieldValue);\n        } else if (SHORT_TYPE.equals(fieldType)) {\n            return Short.parseShort(fieldValue);\n        } else if (INT_TYPE.equals(fieldType)) {","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-easysearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/easysearch/serialize/source/DefaultSeaTunnelRowDeserializer.java#L111-L147","documentation":"DefaultSeaTunnelRowDeserializer.convert wraps per-field value conversion in a catch-all that rethrows any failure as an UNSUPPORTED_OPERATION EasysearchConnectorException, including the field name, raw value, target data type, and the full source record JSON. It is a diagnostic wrapper meaning 'this document field could not be converted to the declared SeaTunnel type'.","triggerScenarios":"Calling deserialize on an Easysearch hit where convertValue (or any parsing step) throws for a field — e.g. a string that cannot parse to the declared SeaTunnelDataType, or a nested map access failing.","commonSituations":"ES documents whose field values don't match the configured schema (string \"abc\" in an INT column, malformed dates), dirty/optional fields present in one document but typed differently in others, schema manually declared in the source config that diverges from actual index mapping.","solutions":["Inspect the logged fieldName/fieldValue and fix the data in the index (clean dirty values) or adjust the declared schema.","Change the SeaTunnel data type for the offending field to STRING and parse downstream.","Add a Transform to filter/repair malformed documents before they reach the deserializer.","If conversion should legitimately support the value, extend convertValue's parsing logic."],"exampleFix":"// before\n{\"age\": {\"type\": \"INT\"}}   // index has age=\"unknown\"\n// after\n{\"age\": {\"type\": \"STRING\"}} // read as string, cast later","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { rows = deserializer.deserialize(hit); } catch (EasysearchConnectorException e) { if (e.getSeaTunnelErrorCode() == UNSUPPORTED_OPERATION && e.getMessage().startsWith(\"error fieldName=\")) { log.warn(\"Skipping bad document: {}\", e.getMessage()); return null; /* or dead-letter */ } throw e; }","preventionTips":["Keep the declared schema in sync with the actual index mapping (GET index/_mapping)","Clean or quarantine dirty documents in the index","Prefer STRING types for heterogeneous fields and parse downstream"],"tags":["easysearch","deserialization","data-conversion"],"backgroundTag":"type-mismatch","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}