fix: restore outer RefFactory after nested JSON deserialization - #443
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The JSON converters in storm-jackson2, storm-jackson3, and storm-kotlinx-serialization bound the deserialization RefFactory with
setandfinally remove. A nestedfromDatabasecall, reachable through a custom deserializer that issues a query, removed the outer factory on its way out. The outer record's remainingReffields then saw no factory and fell back to detached refs, with no exception or log.Each converter now saves the previous ThreadLocal value before binding and restores it on exit, removing the entry only when there was no previous value. This is the same save-and-restore discipline
TransactionScopeuses in core.Each module gains a regression test in which a payload's first field carries a custom deserializer that runs a nested query (mapping
Owner, whose@Json addressfield re-entersfromDatabase), followed by aReffield. The test asserts the ref is attached and fetches. All three tests fail against the previous code withisFetchable()returning false.Note on the kotlinx test: a
@Contextual Ref<T>property inside a@Serializableclass requiresTitself to be@Serializable, since the compiler plugin resolves type-argument serializers even for contextual properties. The test therefore uses a@Serializableentity mapped to the owner table as the ref target.Fixes #385