{"record":{"id":"3659f43396d5739f","repo":"apache/seatunnel","slug":"transport-endpoint-is-required","errorCode":null,"errorMessage":"transport.endpoint is required.","messagePattern":"transport\\.endpoint is required\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-edge-agent/seatunnel-edge-agent-transport/src/main/java/org/apache/seatunnel/edge/agent/transport/config/EdgeTransportConfig.java","lineNumber":49,"sourceCode":"@Getter\npublic class EdgeTransportConfig implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    private final String endpoint;\n    private final String token;\n    private final int connectTimeoutMs;\n    private final int readTimeoutMs;\n    private final int maxBatchSendAttempts;\n    private final long initialBackoffMs;\n    private final long maxBackoffMs;\n    private final int maxReconnectCycles;\n\n    public EdgeTransportConfig(ReadonlyConfig config) {\n        Objects.requireNonNull(config, \"config\");\n        String rawEndpoint = config.get(EdgeTransportOptions.ENDPOINT);\n        if (rawEndpoint == null || rawEndpoint.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"transport.endpoint is required.\");\n        }\n        String trimmedEndpoint = rawEndpoint.trim();\n        EdgeTransportEndpoints.validateFormat(trimmedEndpoint);\n        this.endpoint = trimmedEndpoint;\n\n        String authType = config.get(EdgeTransportOptions.AUTH_TYPE);\n        validateAuthType(authType);\n        String rawToken = config.getOptional(EdgeTransportOptions.TOKEN).orElse(null);\n        if (rawToken == null || rawToken.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"transport.token is required.\");\n        }\n        this.token = rawToken.trim();\n\n        EdgePacketMode.from(config.get(EdgeTransportOptions.PACKET_MODE));\n        EdgePacketCompressionType.from(config.get(EdgeTransportOptions.COMPRESSION));\n        EdgePacketEncryptionType encryption =\n                EdgePacketEncryptionType.from(config.get(EdgeTransportOptions.ENCRYPTION));\n        if (encryption == EdgePacketEncryptionType.AES_GCM) {","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-edge-agent/seatunnel-edge-agent-transport/src/main/java/org/apache/seatunnel/edge/agent/transport/config/EdgeTransportConfig.java#L31-L67","documentation":"EdgeTransportConfig's constructor parses transport settings from ReadonlyConfig and requires a non-blank transport.endpoint. The endpoint defines the server address the agent connects to; without it the transport cannot be built, so it throws this IllegalArgumentException immediately.","triggerScenarios":"Constructing new EdgeTransportConfig(config) where config has no transport.endpoint option, or the value is null/whitespace.","commonSituations":"Agent YAML missing the transport: section entirely; endpoint key misspelled or nested at the wrong level; environment-specific config templates with the endpoint left blank; config filtering dropping the key during deployment.","solutions":["Add a valid transport.endpoint value to the agent config, e.g. transport:\\n  endpoint: host:9090.","Check the key spelling and nesting — the option must sit under transport:, matching EdgeTransportOptions.ENDPOINT.","Ensure deployment templating actually injects the endpoint for the target environment.","Confirm the endpoint passes EdgeTransportEndpoints.validateFormat (correct host:port form) once present."],"exampleFix":"// before\ntransport:\n  token: abc123\n// after\ntransport:\n  endpoint: 10.0.0.5:9090\n  token: abc123","handlingStrategy":"validation","validationCode":"String ep = config.get(EdgeTransportOptions.ENDPOINT); if (ep == null || ep.trim().isEmpty()) { throw new IllegalArgumentException(\"transport.endpoint must be set in config\"); }","typeGuard":"boolean hasEndpoint(org.apache.seatunnel.shade.com.typesafe.config.ReadonlyConfig c) { String v = c.get(EdgeTransportOptions.ENDPOINT); return v != null && !v.trim().isEmpty(); }","tryCatchPattern":"try { new EdgeTransportConfig(config); } catch (IllegalArgumentException e) { if (e.getMessage().equals(\"transport.endpoint is required.\")) { log.error(\"Add transport.endpoint to agent config\"); } throw e; }","preventionTips":["Include transport.endpoint in every environment's config template.","Validate config completeness at deploy time.","Keep key nesting consistent with EdgeTransportOptions.","Fail fast in CI by constructing the config from each environment's YAML."],"tags":["config","transport","missing-field","validation"],"backgroundTag":"missing-required-config-field","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"}