{"record":{"id":"8424df55c0e57893","repo":"apache/seatunnel","slug":"illegal-argument-8424df","errorCode":"ILLEGAL_ARGUMENT","errorMessage":"Invalid NATS JetStream sink option `format`: must be one of: json, native","messagePattern":"Invalid NATS JetStream sink option `format`: must be one of: json, native","errorType":"error_code","errorClass":"NatsJetStreamConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-nats-jetstream/src/main/java/org/apache/seatunnel/connectors/seatunnel/natsjetstream/sink/NatsJetStreamSinkValidator.java","lineNumber":54,"sourceCode":"\nfinal class NatsJetStreamSinkValidator {\n\n    private static final Set<String> SUPPORTED_NATIVE_MAPPING_KEYS =\n            new HashSet<>(\n                    Arrays.asList(\n                            NatsJetStreamSinkOptions.NATIVE_MAPPING_ID,\n                            NatsJetStreamSinkOptions.NATIVE_MAPPING_SUBJECT,\n                            NatsJetStreamSinkOptions.NATIVE_MAPPING_HEADERS,\n                            NatsJetStreamSinkOptions.NATIVE_MAPPING_DATA));\n\n    private NatsJetStreamSinkValidator() {}\n\n    static void validate(ReadonlyConfig pluginConfig, CatalogTable catalogTable) {\n        requireNonBlank(pluginConfig, NatsJetStreamSinkOptions.URL);\n        validateAuthentication(pluginConfig);\n        NatsJetStreamMessageFormat format = pluginConfig.get(NatsJetStreamSinkOptions.FORMAT);\n        if (format == null) {\n            throw invalidOption(\"format\", \"must be one of: json, native\");\n        }\n        if (format == NatsJetStreamMessageFormat.JSON) {\n            requireNonBlank(pluginConfig, NatsJetStreamSinkOptions.SUBJECT);\n            return;\n        }\n        validateNativeMapping(pluginConfig, catalogTable);\n    }\n\n    private static void validateAuthentication(ReadonlyConfig pluginConfig) {\n        Optional<String> username = pluginConfig.getOptional(NatsJetStreamSinkOptions.USERNAME);\n        Optional<String> password = pluginConfig.getOptional(NatsJetStreamSinkOptions.PASSWORD);\n        Optional<String> token = pluginConfig.getOptional(NatsJetStreamSinkOptions.TOKEN);\n\n        boolean hasUsername = username.map(NatsJetStreamSinkValidator::isNotBlank).orElse(false);\n        boolean hasPassword = password.map(NatsJetStreamSinkValidator::isNotBlank).orElse(false);\n        boolean hasToken = token.map(NatsJetStreamSinkValidator::isNotBlank).orElse(false);\n\n        if (hasUsername != hasPassword) {","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-nats-jetstream/src/main/java/org/apache/seatunnel/connectors/seatunnel/natsjetstream/sink/NatsJetStreamSinkValidator.java#L36-L72","documentation":"NatsJetStreamSinkValidator.validate requires the `format` option to resolve to a known NatsJetStreamMessageFormat (json or native). A missing or null format fails validation with ILLEGAL_ARGUMENT before the sink starts.","triggerScenarios":"format option omitted, misspelled (e.g. 'JSON', 'text'), or set to a value not supported by the NATS JetStream sink in this SeaTunnel version.","commonSituations":"Copy-pasted config from another sink (e.g. Kafka) that uses different format names; version upgrade where format keys changed; typo like 'naive' for 'native'.","solutions":["Set format = json for plain JSON messages","Set format = native to publish column-mapped native payloads (also requires native_format_fields)","Check spelling/case of the format value against NatsJetStreamSinkOptions.FORMAT allowed values"],"exampleFix":"// before\nsink {\n  NatsJetStream {\n    url = \"nats://localhost:4222\"\n  }\n}\n// after\nsink {\n  NatsJetStream {\n    url = \"nats://localhost:4222\"\n    format = json\n    subject = \"events\"\n  }\n}","handlingStrategy":"validation","validationCode":"Set<String> allowed = Set.of(\"json\", \"native\");\nif (!allowed.contains(config.getString(\"format\"))) {\n    throw new IllegalArgumentException(\"format must be json or native\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set format explicitly in NATS JetStream sink configs","Copy option names only from official docs, not other connectors","Validate config offline before job submission"],"tags":["nats","jetstream","sink","config-validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}