{"record":{"id":"4ac9639c23a582d7","repo":"OpenFeign/feign","slug":"name-is-required-4ac963","errorCode":null,"errorMessage":"name is required.","messagePattern":"name is required\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/feign/template/HeaderTemplate.java","lineNumber":43,"sourceCode":"import java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.CopyOnWriteArrayList;\nimport 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","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/OpenFeign/feign/blob/e2a1e27560a1e68840c34f031afca88b36096e30/core/src/main/java/feign/template/HeaderTemplate.java#L25-L61","documentation":"HeaderTemplate.create builds a template for a single HTTP header from a name and value collection. The header name is mandatory because Feign cannot emit a header line without one, so a null or empty name is rejected with this IllegalArgumentException at template creation time. It surfaces when calling create directly or via HeaderTemplate.append.","triggerScenarios":"Calling HeaderTemplate.create(null, values) or create(\"\", values); a config-derived header name that is missing/empty; append(null, ...) on an existing HeaderTemplate; variable substitution producing an empty header name.","commonSituations":"Header names read from properties/env vars that are unset; loop-built headers where one key is blank; refactoring that drops the constant header name argument.","solutions":["Always pass a non-null, non-empty header name to create/append.","Guard config lookups for header names and fall back to a default or skip the header.","Validate header names before building the request template.","Skip adding the header entirely when the configured name is blank."],"exampleFix":"// before\nHeaderTemplate.create(config.getHeaderName(), values); // name may be null\n// after\nif (config.getHeaderName() != null && !config.getHeaderName().isEmpty()) {\n  HeaderTemplate.create(config.getHeaderName(), values);\n}","handlingStrategy":"validation","validationCode":"if (headerName == null || headerName.isEmpty()) {\n  throw new IllegalArgumentException(\"header name must be non-empty before building template\");\n}\nHeaderTemplate.create(headerName, values);","typeGuard":"static boolean validHeaderName(String n) { return n != null && !n.isEmpty(); }","tryCatchPattern":"try {\n  tpl.header(name, values);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().equals(\"name is required.\")) {\n    log.warn(\"Skipping header with blank name\");\n  } else throw e;\n}","preventionTips":["Validate header names from config/env at startup, not at request time.","Never build header maps that allow blank keys.","Trim names read from external sources before use.","Skip rather than fail when an optional header is unconfigured."],"tags":["feign","header-template","missing-name","argument-validation"],"backgroundTag":"missing-required-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"}