On kof22 (admin.kof22.com, qbit-alerts 0.1.0-RC.2 on QQQ 4.1.0-RC.6), opening a notification's Recipients tab showed:
An error occurred loading widget content. IllegalArgumentException (Error in JSON Serialization)
The server log showed JsonUtils: Error serializing object of type [ChildRecordListData] with the cause StreamConstraintsException: Document nesting depth (1001) exceeds the maximum allowed (1000).
Root cause
ChildRecordListData carries the child table's QTableMetaData. That class implements core SourceQBitAware, and the interface's default getSourceQBitConfig() acts as a bean getter, so Jackson serializes the qbit config. AlertsQBitConfig.getRuntime() returns the AlertsRuntime, and the runtime's config points back at the config:
The transient modifier doesn't stop Jackson, because it serializes through getters. Every alerts child list hits this, not just Recipients: Timeline, Records, Members and the others all fail the same way.
Fix
AlertsQBitConfig.getRuntime() and getAudienceResolver() are now @JsonIgnore. This is the pattern the cms, quick-search and sql-workbench configs already use.
New ChildListWidgetsJsonTest:
It renders the Recipients list for a notification with two recipient rows and serializes it.
It renders every child-list widget in the qbit and serializes each one.
It serializes the config itself.
All three tests fail without the fix and pass with it.
CHANGELOG entry.
The core side is a separate QRun-IO/qqq PR. It stops SourceQBitAware from serializing qbit configs at all, and it makes JsonUtils name the reference cycle instead of failing at 1000 levels deep. This qbit fix lets kof22 work on the QQQ 4.1.0-RC.6 it runs today.
Verification
./mvnw -B verify passes, with 176 tests, 0 failures, and checkstyle, guardrails and JaCoCo all green.
Release
kof22 needs a qbit-alerts RC with this fix. It is pinned to RC.2, and Website-Backend#227 moves it to RC.5.
## Problem
On kof22 (admin.kof22.com, qbit-alerts 0.1.0-RC.2 on QQQ 4.1.0-RC.6), opening a notification's **Recipients** tab showed:
> An error occurred loading widget content. IllegalArgumentException (Error in JSON Serialization)
The server log showed `JsonUtils: Error serializing object of type [ChildRecordListData]` with the cause `StreamConstraintsException: Document nesting depth (1001) exceeds the maximum allowed (1000)`.
## Root cause
`ChildRecordListData` carries the child table's `QTableMetaData`. That class implements core `SourceQBitAware`, and the interface's default `getSourceQBitConfig()` acts as a bean getter, so Jackson serializes the qbit config. `AlertsQBitConfig.getRuntime()` returns the `AlertsRuntime`, and the runtime's `config` points back at the config:
`QTableMetaData.sourceQBitConfig -> AlertsQBitConfig.runtime -> AlertsRuntime.config -> AlertsQBitConfig.runtime -> ...`
The `transient` modifier doesn't stop Jackson, because it serializes through getters. Every alerts child list hits this, not just Recipients: Timeline, Records, Members and the others all fail the same way.
## Fix
- `AlertsQBitConfig.getRuntime()` and `getAudienceResolver()` are now `@JsonIgnore`. This is the pattern the cms, quick-search and sql-workbench configs already use.
- New `ChildListWidgetsJsonTest`:
- It renders the Recipients list for a notification with two recipient rows and serializes it.
- It renders every child-list widget in the qbit and serializes each one.
- It serializes the config itself.
All three tests fail without the fix and pass with it.
- CHANGELOG entry.
The core side is a separate QRun-IO/qqq PR. It stops `SourceQBitAware` from serializing qbit configs at all, and it makes JsonUtils name the reference cycle instead of failing at 1000 levels deep. This qbit fix lets kof22 work on the QQQ 4.1.0-RC.6 it runs today.
## Verification
`./mvnw -B verify` passes, with 176 tests, 0 failures, and checkstyle, guardrails and JaCoCo all green.
## Release
kof22 needs a qbit-alerts RC with this fix. It is pinned to RC.2, and Website-Backend#227 moves it to RC.5.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
On kof22 (admin.kof22.com, qbit-alerts 0.1.0-RC.2 on QQQ 4.1.0-RC.6), opening a notification's Recipients tab showed:
The server log showed
JsonUtils: Error serializing object of type [ChildRecordListData]with the causeStreamConstraintsException: Document nesting depth (1001) exceeds the maximum allowed (1000).Root cause
ChildRecordListDatacarries the child table'sQTableMetaData. That class implements coreSourceQBitAware, and the interface's defaultgetSourceQBitConfig()acts as a bean getter, so Jackson serializes the qbit config.AlertsQBitConfig.getRuntime()returns theAlertsRuntime, and the runtime'sconfigpoints back at the config:QTableMetaData.sourceQBitConfig -> AlertsQBitConfig.runtime -> AlertsRuntime.config -> AlertsQBitConfig.runtime -> ...The
transientmodifier doesn't stop Jackson, because it serializes through getters. Every alerts child list hits this, not just Recipients: Timeline, Records, Members and the others all fail the same way.Fix
AlertsQBitConfig.getRuntime()andgetAudienceResolver()are now@JsonIgnore. This is the pattern the cms, quick-search and sql-workbench configs already use.New
ChildListWidgetsJsonTest:All three tests fail without the fix and pass with it.
CHANGELOG entry.
The core side is a separate QRun-IO/qqq PR. It stops
SourceQBitAwarefrom serializing qbit configs at all, and it makes JsonUtils name the reference cycle instead of failing at 1000 levels deep. This qbit fix lets kof22 work on the QQQ 4.1.0-RC.6 it runs today.Verification
./mvnw -B verifypasses, with 176 tests, 0 failures, and checkstyle, guardrails and JaCoCo all green.Release
kof22 needs a qbit-alerts RC with this fix. It is pinned to RC.2, and Website-Backend#227 moves it to RC.5.
🤖 Generated with Claude Code