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
- Verify the templateName exactly matches an existing registered service that serves as the template (name/lookup key)
- Register the missing template service definition in the same registry CAS consults
- Check logs for which template names resolved; fix typos and stray whitespace in comma-delimited lists
- 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
- Verify templateName strings match registered template services exactly
- Keep template definitions in the same registry environment as dependents
- Rename templates atomically: register new name, update dependents, remove old
- Watch for the 'cannot be found and is not applicable' warning after deployments
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
- Unable to locate registered service for clientId
- Skipped registration of
- No user can be accepted because none is defined
- Not all requested multifactor providers could be found…
- Cookie name is undefined
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)