apereo/cas · warning

Registered service template definition

Error message

Registered service template definition [{}] cannot be found and is not applicable to [{}]

What it means

DefaultRegisteredServicesTemplatesManager.apply merges template service definitions into a registered service that declares templateName. When a referenced template cannot be located via locateTemplateServiceDefinition, CAS only logs a warning — the template is skipped and the service is used without that template's settings. This is not thrown but signals a misconfigured or missing template definition.

Solutions

  1. Verify the templateName exactly matches an existing registered service that serves as the template (name/lookup key)
  2. Register the missing template service definition in the same registry CAS consults
  3. Check logs for which template names resolved; fix typos and stray whitespace in comma-delimited lists
  4. After fixing, reload the service registry or restart so dependent services re-merge with their templates

Example fix

// before
// "templateName":"base-saml-template"  // no such template registered
// after
// "templateName":"saml-base-template"   // matches registered template service
Defensive patterns

Strategy: validation

Validate before calling

Optional<RegisteredService> tpl = locateTemplateServiceDefinition(service, templateName);
if (tpl.isEmpty()) {
    LOGGER.error("Template [{}] missing for service [{}]", templateName, service.getName());
}

Prevention

When it happens

Trigger: apply() iterates comma-delimited templateName values on a RegisteredService and locateTemplateServiceDefinition finds no matching service definition for one of the names — template service missing from the registry, wrong template name (case/whitespace), template defined in a registry not consulted for template lookup, or circular/self-referencing template excluded.

Common situations: Copy-pasted templateName that doesn't match any registered service's name/id; template service stored in a different registry environment; template referenced before its defining service was loaded; renaming a template service without updating dependents.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at core/cas-server-core-services-registry/src/main/java/org/apereo/cas/services/DefaultRegisteredServicesTemplatesManager.java:57

            ? FileUtils.listFiles(location.getFile(), new String[]{"json"}, true)
            : new ArrayList<>());
        LOGGER.trace("Found [{}] template registered service definition(s)", templateDefinitionFiles.size());
    }

    @Override
    public RegisteredService apply(final RegisteredService registeredService) {
        if (templateDefinitionFiles.isEmpty() || StringUtils.isBlank(registeredService.getTemplateName())) {
            LOGGER.trace("Registered service template directory contains no template definitions, "
                         + "or registered service [{}] does specify template name(s)", registeredService.getName());
            return registeredService;
        }

        RegisteredService mergeResult = null;
        val templateNames = org.springframework.util.StringUtils.commaDelimitedListToStringArray(registeredService.getTemplateName().trim());
        for (val templateName : templateNames) {
            val templateDefinition = locateTemplateServiceDefinition(registeredService, templateName);
            if (templateDefinition.isEmpty()) {
                LOGGER.warn("Registered service template definition [{}] cannot be found and is not applicable to [{}]",
                    templateName, registeredService.getName());
            } else {
                val templateService = templateDefinition.get();
                LOGGER.trace("Applying template service definition [{}] to service [{}]", templateService, registeredService.getName());
                mergeResult = registeredServiceSerializer.merge(templateService, Objects.requireNonNullElse(mergeResult, registeredService));
                LOGGER.debug("Resulting service definition after merging with template [{}] is:\n[{}]",
                    templateService.getTemplateName(), mergeResult);
            }
        }
        return Objects.requireNonNullElse(mergeResult, registeredService);
    }

    private Optional<RegisteredService> locateTemplateServiceDefinition(final RegisteredService registeredService,
                                                                        final String templateName) {
        val scriptFactory = ExecutableCompiledScriptFactory.getExecutableCompiledScriptFactory();
        return templateDefinitionFiles
            .stream()
            .filter(_ -> CasRuntimeHintsRegistrar.notInNativeImage())

View on GitHub (pinned to e7288fc434)