{"record":{"id":"57965fad1b28eedf","repo":"OpenFeign/feign","slug":"values-are-required","errorCode":null,"errorMessage":"values are required","messagePattern":"values are required","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/feign/template/HeaderTemplate.java","lineNumber":47,"sourceCode":"import java.util.stream.Collectors;\nimport java.util.stream.StreamSupport;\n\n/**\n * Template for HTTP Headers. Variables that are unresolved are ignored and Literals are not\n * encoded.\n */\npublic final class HeaderTemplate {\n\n  private final String name;\n  private final List<Template> values = new CopyOnWriteArrayList<>();\n\n  public static HeaderTemplate create(String name, Iterable<String> values) {\n    if (name == null || name.isEmpty()) {\n      throw new IllegalArgumentException(\"name is required.\");\n    }\n\n    if (values == null) {\n      throw new IllegalArgumentException(\"values are required\");\n    }\n\n    return new HeaderTemplate(name, values, Util.UTF_8);\n  }\n\n  public static HeaderTemplate literal(String name, Iterable<String> values) {\n    if (name == null || name.isEmpty()) {\n      throw new IllegalArgumentException(\"name is required.\");\n    }\n\n    if (values == null) {\n      throw new IllegalArgumentException(\"values are required\");\n    }\n\n    return new HeaderTemplate(name, values, Util.UTF_8, true);\n  }\n\n  /**","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/OpenFeign/feign/blob/e2a1e27560a1e68840c34f031afca88b36096e30/core/src/main/java/feign/template/HeaderTemplate.java#L29-L65","documentation":"HeaderTemplate.create requires a values collection; a null Iterable means the template would have no values to expand, so Feign rejects it with this IllegalArgumentException. Note that only null is rejected — an empty Iterable is accepted and simply yields a header with no values.","triggerScenarios":"Calling HeaderTemplate.create(name, null); passing a map lookup result that was null because the key was absent; append(name, null) on an existing HeaderTemplate.","commonSituations":"Collections built from optional config (Map.get returning null); deserialized header maps missing a key; methods returning null instead of empty collections.","solutions":["Pass Collections.emptyList() instead of null when there are no values.","Coalesce null collections: values == null ? Collections.emptyList() : values.","Fix the upstream source (Map.getOrDefault, Optional) so it returns an empty collection.","Check for null before calling create and skip the header."],"exampleFix":"// before\nHeaderTemplate.create(\"X-Custom\", headersByName.get(\"custom\")); // may be null\n// after\nList<String> vals = headersByName.getOrDefault(\"custom\", Collections.emptyList());\nHeaderTemplate.create(\"X-Custom\", vals);","handlingStrategy":"type-guard","validationCode":"List<String> safe = values == null ? Collections.emptyList() : values;\nHeaderTemplate.create(name, safe);","typeGuard":"static <T> Iterable<T> nonNull(Iterable<T> it) { return it == null ? Collections.emptyList() : it; }","tryCatchPattern":"try {\n  tpl.header(name, values);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().equals(\"values are required\")) {\n    tpl.header(name, Collections.emptyList());\n  } else throw e;\n}","preventionTips":["Return empty collections, never null, from methods that feed header templates.","Use Map.getOrDefault(key, Collections.emptyList()) for optional header lookups.","Enable null-analysis/Optional in code building header maps.","Remember only null is rejected; empty collections are fine."],"tags":["feign","header-template","null-argument","argument-validation"],"backgroundTag":"null-argument","analyzedSha":"e2a1e27560a1e68840c34f031afca88b36096e30","analyzedAt":"2026-09-10T12:37:37.238Z","contentChangedAt":"2026-09-10T12:37:37.238Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}