{"record":{"id":"f356545be1df23f7","repo":"apache/iceberg","slug":"cannot-build-storagecredential-some-of-required-a","errorCode":null,"errorMessage":"Cannot build StorageCredential, some of required attributes are not set: prefix","messagePattern":"Cannot build StorageCredential, some of required attributes are not set: prefix","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/io/ImmutableStorageCredential.java","lineNumber":293,"sourceCode":"      for (Map.Entry<String, ? extends String> e : entries.entrySet()) {\n        String k = e.getKey();\n        String v = e.getValue();\n        this.config.put(\n            Objects.requireNonNull(k, \"config key\"),\n            Objects.requireNonNull(v, v == null ? \"config value for key: \" + k : null));\n      }\n      return this;\n    }\n\n    /**\n     * Builds a new {@link ImmutableStorageCredential ImmutableStorageCredential}.\n     *\n     * @return An immutable instance of StorageCredential\n     * @throws java.lang.IllegalStateException if any required attributes are missing\n     */\n    public ImmutableStorageCredential build() {\n      if (null == prefix) {\n        throw new IllegalStateException(\n            \"Cannot build StorageCredential, some of required attributes are not set: prefix\");\n      }\n\n      return ImmutableStorageCredential.validate(\n          new ImmutableStorageCredential(prefix, createSerializableMap(false, false, config)));\n    }\n  }\n\n  private static <K, V> Map<K, V> createSerializableMap(\n      boolean checkNulls, boolean skipNulls, Map<? extends K, ? extends V> map) {\n    Map<K, V> linkedMap = new LinkedHashMap<>();\n    if (skipNulls || checkNulls) {\n      for (Map.Entry<? extends K, ? extends V> e : map.entrySet()) {\n        K k = e.getKey();\n        V v = e.getValue();\n        if (skipNulls) {\n          if (k == null || v == null) continue;\n        } else if (checkNulls) {","sourceCodeStart":275,"sourceCodeEnd":311,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/io/ImmutableStorageCredential.java#L275-L311","documentation":"StorageCredential is an immutable value object generated with a required 'prefix' attribute (the storage location URI the credential applies to). The Builder refuses to produce an instance when prefix was never set, throwing IllegalStateException listing the missing attribute. This is a fail-fast guard so consumers never receive a credential with no scope.","triggerScenarios":"Calling StorageCredential.Builder.build() without first invoking .prefix(...), e.g. constructing a credential from a REST catalog response that lacked a storage-credentials prefix, or hand-building a credential and forgetting the prefix field.","commonSituations":"Deserializing vended credentials from a REST catalog where the server omitted 'prefix'; custom catalog code vendoring credentials without setting the location; tests/fixtures constructing credentials with only config map.","solutions":["Set prefix on the builder before build(): new StorageCredential.Builder().prefix(locationUri)...","If the credential came from a remote response, validate the response contains a prefix before mapping it into the builder","Ensure the catalog server (or test mock) returns the prefix field in its storage credential JSON"],"exampleFix":"// before\nStorageCredential cred = new StorageCredential.Builder()\n    .config(config)\n    .build(); // IllegalStateException: prefix not set\n// after\nStorageCredential cred = new StorageCredential.Builder()\n    .prefix(\"s3://bucket/path/\")\n    .config(config)\n    .build();","handlingStrategy":"validation","validationCode":"if (prefix == null || prefix.isEmpty()) {\n  throw new IllegalArgumentException(\"Storage credential prefix is required\");\n}\nStorageCredential cred = new StorageCredential.Builder().prefix(prefix).config(config).build();","typeGuard":null,"tryCatchPattern":"try {\n  return new StorageCredential.Builder().prefix(p).config(cfg).build();\n} catch (IllegalStateException e) {\n  log.error(\"Credential build failed: {}\", e.getMessage());\n  throw e;\n}","preventionTips":["Always set prefix first when building StorageCredential","Validate REST catalog responses include prefix before mapping to the builder","Cover credential construction in unit tests"],"tags":["builder","validation","storage-credential","rest-catalog"],"backgroundTag":"missing-required-argument","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}