apereo/cas · warning

Ticket [ ] is not registered in the catalog and is…

Error message

Ticket [{}] is not registered in the catalog and is unrecognized

What it means

This is a WARN log emitted by IgniteTicketRegistry.getTicket when the requested ticket id has no entry in the CAS ticket catalog. The registry resolves tickets by looking up the ticket's metadata (including the Ignite storage/table name) from the TicketCatalog; if the catalog does not know the id prefix, it cannot determine which Ignite table to query and returns null instead of throwing. It indicates the ticket id is malformed or belongs to a ticket type that was never registered with the catalog.

Solutions

  1. Verify the ticket id string is a genuine CAS ticket id with a known prefix and is not truncated or corrupted before calling getTicket
  2. Ensure every custom ticket definition is registered with the TicketCatalog (cas.ticket.catalog entries) so its prefix maps to metadata and the correct Ignite storage name
  3. Check for CAS version/config changes that renamed ticket prefixes; migrate or invalidate old ids
  4. Handle the null return gracefully - treat it as TicketException/invalid-ticket flow rather than expecting an exception

Example fix

// before
val ticket = ticketRegistry.getTicket(requestedId, TicketGrantingTicket.class);
ticket.getAuthentication();
// after
val ticket = ticketRegistry.getTicket(requestedId, TicketGrantingTicket.class);
if (ticket == null) {
    throw new InvalidTicketException(new BadRequ...
Defensive patterns

Strategy: validation

Validate before calling

if (ticketId == null || ticketId.isBlank() || !ticketId.matches("(TGT|ST|PT|PGT|RT|OC|IMP)-.*")) { throw new IllegalArgumentException("Unknown ticket id format: " + ticketId); }

Type guard

function isValidTicketId(id) { return typeof id === 'string' && /^(TGT|ST|PT|PGT|RT)-/.test(id); }

Try / catch

try { val ticket = registry.getTicket(id, TicketGrantingTicket.class); if (ticket == null) { /* treat as invalid ticket */ } } catch (TicketException e) { /* handle invalid/expired */ }

Prevention

When it happens

Trigger: Calling ticketRegistry.getTicket(ticketId) with an id whose prefix (e.g. TGT-, ST-, PGT-) does not match any TicketCatalog registration; passing an arbitrary/garbage string (e.g. from a forged or legacy callback parameter) to getTicket; a custom ticket type added to Ignite but not registered in the ticket catalog; ticket-id prefix renaming after a version upgrade or config change so old ids no longer resolve to metadata.

Common situations: Validation of a ticket id taken from an untrusted request parameter; cleanup jobs iterating over stale external references to deleted ticket types; clusters upgraded where the catalog configuration lost a ticket definition so previously valid ids now return null; tests passing literal placeholder ids.

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/df74960aa29bf446. Report an issue: GitHub.

Appendix: source

Thrown at support/cas-server-support-ignite-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/IgniteTicketRegistry.java:122

        if (metadata != null) {
            val sql = "DELETE FROM %s where id=?".formatted(metadata.getProperties().getStorageName());
            try (val rs = ignite.sql().execute(null, sql, encTicketId)) {
                return rs.affectedRows();
            }
        }
        return 0;
    }

    @Override
    public @Nullable Ticket getTicket(final String ticketIdToGet, final Predicate<Ticket> predicate) {
        val ticketId = digestIdentifier(ticketIdToGet);
        if (StringUtils.isBlank(ticketId)) {
            return null;
        }
        LOGGER.debug("Encoded ticket id is [{}]", ticketId);
        val metadata = ticketCatalog.find(ticketIdToGet);
        if (metadata == null) {
            LOGGER.warn("Ticket [{}] is not registered in the catalog and is unrecognized", ticketIdToGet);
            return null;
        }
        val table = ignite.tables().table(metadata.getProperties().getStorageName());
        val kvView = table.keyValueView();
        val keyTuple = Tuple.create().set("id", ticketId);
        val valueTuple = kvView.get(null, keyTuple);
        if (valueTuple == null) {
            LOGGER.debug("No ticket by id [{}] is found in the ignite ticket registry", ticketIdToGet);
            return null;
        }
        val ticketBytes = valueTuple.bytesValue("ticket");
        val result = decodeAndDeserialize(ticketBytes);
        return predicate.test(result) ? result : null;
    }

    @Override
    public Collection<? extends Ticket> getTickets() {
        try (val stream = stream()) {

View on GitHub (pinned to e7288fc434)