apache/pulsar · error · RuntimeException

Invalid value '' for enum

Error message

Invalid value '' for enum 

What it means

Thrown by FieldParser.enum conversion when a string value cannot be resolved to a constant of the target enum type — Jackson's EnumResolver.findEnum returns null and the parser raises a RuntimeException naming both the invalid value and the enum type. This is used when mapping string configuration into typed fields.

Solutions

  1. Fix the configured value to exactly match an enum constant name (case-sensitive, no whitespace)
  2. Check the enum's declared constants (e.g. print or read the target enum class) and pick a valid one
  3. Align configuration with the Pulsar version in use — verify the constant exists in that release
  4. Pre-validate the string with EnumUtils/Enum.valueOf inside a try-catch before assigning the config

Example fix

// before
FieldParser.value("CompressionTyppe.LZ4", CompressionType.class) // typo
// after
FieldParser.value("LZ4", CompressionType.class)
Defensive patterns

Strategy: validation

Validate before calling

boolean valid = Arrays.stream(CompressionType.values())
    .anyMatch(e -> e.name().equals(cfgValue.trim()));
if (!valid) throw new IllegalArgumentException("invalid enum value: " + cfgValue);

Type guard

static <E extends Enum<E>> boolean isValidEnumValue(String s, Class<E> type) {
    if (s == null) return false;
    return Arrays.stream(type.getEnumConstants()).anyMatch(e -> e.name().equals(s.trim()));
}

Try / catch

try {
    Object v = FieldParser.value(raw, CompressionType.class);
} catch (RuntimeException e) {
    log.error("Config value '{}' is not a valid {}; valid: {}", raw, "CompressionType",
        Arrays.toString(CompressionType.values()));
    throw e;
}

Prevention

When it happens

Trigger: Calling FieldParser.value/convert (directly or via stringToList/stringToSet/stringToMap) with a string that is not an exact enum constant name of the target type — including wrong case, trailing whitespace, or a constant added only in newer Pulsar versions.

Common situations: Configuration files (broker/client/service_unit yaml) with a misspelled or mis-cased enum value; config copied from docs of a different Pulsar version where the enum constant changed; extra whitespace or quotes in the value; using display names instead of the enum constant name.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of apache/pulsar@820761864e (2026-09-06). Data as JSON: /api/errors/36018f34e8a715ae. Report an issue: GitHub.

Appendix: source

Thrown at pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java:113

        // Lookup the suitable converter.
        String converterId = from.getClass().getName() + "_" + to.getName();
        Method converter = CONVERTERS.get(converterId);

        if (to.isEnum()) {
            // Converting string to enum
            DeserializationConfig deserializationConfig =
                    ObjectMapperFactory.getMapper().getObjectMapper().getDeserializationConfig();
            // No replacement API available in Jackson 2.x
            AnnotatedClass annotatedEnum = AnnotatedClassResolver.resolve(
                    deserializationConfig,
                    deserializationConfig.getTypeFactory().constructType(to),
                    deserializationConfig
            );
            EnumResolver r = EnumResolver.constructUsingToString(deserializationConfig, annotatedEnum);
            T value = (T) r.findEnum((String) from);
            if (value == null) {
                throw new RuntimeException("Invalid value '" + from + "' for enum " + to);
            }
            return value;
        }

        if (converter == null) {
            throw new UnsupportedOperationException("Cannot convert from " + from.getClass().getName() + " to "
                    + to.getName() + ". Requested converter does not exist.");
        }

        // Convert the value.
        try {
            Object val = converter.invoke(to, from);
            return to.cast(val);
        } catch (Exception e) {
            throw new RuntimeException("Cannot convert from " + from.getClass().getName() + " to " + to.getName()
                    + ". Conversion failed with " + e.getMessage(), e);
        }
    }

View on GitHub (pinned to 820761864e)