Overview
ChangeStreamContext<T> is the main runtime object passed to every handler method (@OnChange, @OnInsert, @OnUpdate, @OnDelete, @OnReplace). It provides access to the event metadata, documents, and runtime actions.
Document access
getFullDocument
Returns the full document after the operation, automatically converted to the requested type using Spring’sMongoConverter.
DELETE operations, the full document is not available and the method returns Optional.empty().
getFullDocumentBeforeChange
Returns the document before the operation, automatically converted using Spring’sMongoConverter. This is useful for comparing old vs. new state (e.g., audit logging, status transition tracking).
@ChangeStream annotation controls how pre-images are requested:
fullDocumentBeforeChange | Behavior if pre-images are not enabled on collection |
|---|---|
OFF (default) | No pre-image requested. getFullDocumentBeforeChange() always returns Optional.empty(). |
WHEN_AVAILABLE | Returns Optional.empty() silently. Safe for optional use cases. |
REQUIRED | MongoDB returns an error and the event processing fails. Use when pre-images are mandatory. |
getUpdateDescription
ForUPDATE operations, returns an UpdateDescription describing the modified fields. Returns Optional.empty() for non-UPDATE operations.
UpdateDescription methods
| Method | Returns | Description |
|---|---|---|
getUpdatedFields() | Map<String, Object> | All fields that were updated and their new values |
getRemovedFields() | List<String> | Dot-notation paths of fields that were removed |
getTruncatedArrays() | List<TruncatedArray> | Arrays that were truncated during the update (e.g. $pop operations) |
hasFieldChanged(String path) | boolean | Whether the given field was modified (updated or removed) |
getUpdatedFieldValue(String path, Class<V> type) | Optional<V> | The new value of a specific updated field, typed |
Targeted field changes
hasFieldChanged and getUpdatedFieldValue let you react to specific fields without manually walking the updated-fields map:
"address.city").
Event metadata
| Method | Returns | Description |
|---|---|---|
getEventId() | String | Unique ID generated by FlowWarden for this event |
getOperationType() | OperationType | INSERT, UPDATE, REPLACE, DELETE, DROP, INVALIDATE |
getStreamName() | String | Name of the @ChangeStream handler |
getCollectionName() | String | Source MongoDB collection |
getDatabaseName() | String | Source MongoDB database |
getClusterTime() | Instant | MongoDB cluster timestamp (second precision) |
getWallTime() | Instant | MongoDB wall-clock timestamp (millisecond precision, MongoDB 6.0+). Returns null if unavailable. |
getResumeToken() | BsonDocument | Resume token for checkpointing |
getTransactionInfo() | Optional<TransactionInfo> | MongoDB transaction metadata (lsid, txnNumber) when the event is part of a transaction; Optional.empty() for standalone operations |
getDocumentKey() | BsonValue | The _id of the affected document |
getAttemptNumber() | int | Current retry attempt (1-based) |
summary() | String | Human-readable summary of the event, suitable for logging |
TransactionInfo
lsid (logical session id) and txnNumber together for every event in a transaction, or omits both for standalone operations. They’re grouped in a record so handlers cannot observe one without the other; absence is represented by Optional.empty() at the call site. Useful for grouping events of the same transaction — audit logs, aggregation, atomicity-preserving downstream propagation.