apache/dubbo · error · UnsupportedOperationException

No instance of 'ConfigurationUtils' for you!

Error message

No instance of 'ConfigurationUtils' for you! 

What it means

Thrown from the private constructor of ConfigurationUtils, which is a final utility class with only static methods. The constructor always throws UnsupportedOperationException to prevent accidental instantiation. This is a standard pattern for enforcing that a utility class is never instantiated.

Source

Thrown at dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java:56

import java.util.Objects;
import java.util.Properties;
import java.util.Set;

import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT;
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_PROPERTY_TYPE_MISMATCH;

/**
 * Utilities for manipulating configurations from different sources
 */
public final class ConfigurationUtils {

    /**
     * Forbids instantiation.
     */
    private ConfigurationUtils() {
        throw new UnsupportedOperationException("No instance of 'ConfigurationUtils' for you! ");
    }

    private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(ConfigurationUtils.class);
    private static final Set<String> securityKey;

    private static volatile long expectedShutdownTime = Long.MAX_VALUE;

    static {
        Set<String> keys = new HashSet<>();
        keys.add("accesslog");
        keys.add("router");
        keys.add("rule");
        keys.add("runtime");
        keys.add("type");
        securityKey = Collections.unmodifiableSet(keys);
    }

    /**

View on GitHub (pinned to 3a3043227f)

Solutions

  1. Stop instantiating the class — all methods on ConfigurationUtils are static. Call them directly: ConfigurationUtils.getProperty(scopeModel, key).
  2. If a reflection-based framework is responsible, configure it to exclude ConfigurationUtils from instantiation (e.g. Objenesis exclusions, Jackson @JsonIgnoreType, or module-specific excludes).
  3. If testing, mock the static methods (e.g. Mockito mockStatic) rather than constructing an instance.

Example fix

// before
ConfigurationUtils utils = new ConfigurationUtils();
String v = utils.getProperty(scopeModel, "key");

// after
String v = ConfigurationUtils.getProperty(scopeModel, "key");
Defensive patterns

Strategy: validation

Validate before calling

// Ensure you never call 'new ConfigurationUtils()'.
// Use static access only:
ConfigurationUtils.getProperty(scopeModel, key);

Type guard

if (clazz == ConfigurationUtils.class) {
    // do not attempt instantiation; all members are static
    throw new UnsupportedOperationException("ConfigurationUtils is a utility class");
}

Try / catch

try {
    Constructor<?> c = clazz.getDeclaredConstructor();
    c.setAccessible(true);
    c.newInstance();
} catch (InvocationTargetException e) {
    if (e.getCause() instanceof UnsupportedOperationException) {
        // expected for utility classes — skip
    }
}

Prevention

When it happens

Trigger: Any code that calls new ConfigurationUtils() — whether via reflection (Constructor.setAccessible(true) + newInstance) or by a subclass/caller that bypasses the private modifier through an accessibility hack. Normal usage (static method calls) never triggers this.

Common situations: Reflection-based frameworks (certain serialization or DI containers) that try to instantiate any class they encounter. Unit-test mocking frameworks that attempt to create instances of classes they should not. A developer unfamiliar with the utility-class pattern writing new ConfigurationUtils().getGlobalProperty(...).

Related errors


AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14). Data as JSON: /api/errors/e5218ec1605d6b16. Report an issue: GitHub.