apereo/cas · error · Error

Failed to load configuration metadata

Error message

Failed to load configuration metadata: ${response.status}

What it means

loadConfigurationMetadata() fetches the CAS actuator configuration-metadata endpoint and throws if the HTTP response is not OK, embedding the numeric status in the message. It surfaces endpoint failures (401/403/404/5xx) to the configuration-operations UI.

Solutions

  1. Expose the configuration-metadata actuator endpoint in CAS management endpoint configuration
  2. Ensure the browser user is authenticated/authorized for actuator endpoints
  3. Interpret the status in the message: 404 = endpoint disabled or wrong URL; 401/403 = permissions; 5xx = check CAS server logs
  4. Verify CasActuatorEndpoints.configurationMetadata() resolves to the correct CAS base URL

Example fix

// before
throw new Error(`Failed to load configuration metadata: ${response.status}`);
// after
if (!response.ok) {
    console.warn(`Configuration metadata unavailable (HTTP ${response.status}); using local fallback`);
    return;
}
Defensive patterns

Strategy: try-catch

Validate before calling

const url = CasActuatorEndpoints.configurationMetadata();
if (!url) return; // endpoint not configured/enabled
const resp = await fetch(url, { credentials: 'include' });
const healthy = resp.ok;

Type guard

const hasMetadataEndpoint = () => typeof CasActuatorEndpoints.configurationMetadata === 'function' && !!CasActuatorEndpoints.configurationMetadata();

Try / catch

try { await loadConfigurationMetadata(); } catch (e) { if (/Failed to load configuration metadata/.test(e.message)) { renderMetadataUnavailable(e.message); } else { throw e; } }

Prevention

When it happens

Trigger: initializeConfigurationOperations -> loadConfigurationMetadata when the actuator endpoint returns non-2xx: endpoint not exposed, unauthenticated request (401/403), wrong URL (404), or server error (5xx).

Common situations: configurationMetadata actuator endpoint not enabled/exposed in management endpoint config, security blocking actuator access, CAS server not fully started, wrong base URL in CasActuatorEndpoints.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of apereo/cas@e7288fc434 (2026-09-08). Data as JSON: /api/errors/d96bc7d52d985c2b. Report an issue: GitHub.

Appendix: source

Thrown at support/cas-server-support-thymeleaf/src/main/resources/static/js/palantir-cas-config.js:528

                        propertyName: propertyName,
                        propertyValue: value,
                        propertySource: source.name
                    });
                }
            }
        }
    }
    configurationTable.search("").draw();
    mutableConfigurationTable.search("").draw();
}

async function loadConfigurationMetadata() {
    if (!CasActuatorEndpoints.configurationMetadata() || CAS_CONFIG_METADATA.length === 0) {
        return;
    }
    const response = await fetch(CasActuatorEndpoints.configurationMetadata());
    if (!response.ok) {
        throw new Error(`Failed to load configuration metadata: ${response.status}`);
    }

    CAS_CONFIG_METADATA = Object.values(await response.json());
}

async function populateConfigurationNameSelectOptions() {
    const nameElem = $("#newConfigPropertyName")[0];
    const ts = nameElem.tomselect;
    const currentValue = ts.getValue();
    const entries = [...new Map(
        CAS_CONFIG_METADATA
            .filter(entry => entry.id)
            .map(entry => [
                entry.id,
                {
                    id: entry.id,
                    name: entry.id,
                    type: entry.type,

View on GitHub (pinned to e7288fc434)