fix: resolve MissingFieldException when mapping primitive field into …#641
Conversation
…nested object (ExpediaGroup#559) When using withFieldMapping to map a root-level source field into a nested destination field (e.g. "x" -> "nestedObject.x"), the transformer incorrectly looked for the field in the nested source object instead of the root source. The fix stores the root source object in a ThreadLocal during transformation and uses it to resolve field mappings that reference breadcrumb-qualified destination paths. This ensures root-level source fields are correctly accessible when processing nested destination objects. Closes ExpediaGroup#559
bull-bean-transformer/src/main/java/com/expediagroup/beans/transformer/TransformerImpl.java
Show resolved
Hide resolved
bull-bean-transformer/src/main/java/com/expediagroup/beans/transformer/TransformerImpl.java
Outdated
Show resolved
Hide resolved
bull-bean-transformer/src/main/java/com/expediagroup/beans/transformer/TransformerImpl.java
Outdated
Show resolved
Hide resolved
...nsformer/src/test/java/com/expediagroup/beans/transformer/MixedObjectTransformationTest.java
Show resolved
Hide resolved
...nsformer/src/test/java/com/expediagroup/beans/transformer/MixedObjectTransformationTest.java
Show resolved
Hide resolved
...nsformer/src/test/java/com/expediagroup/beans/transformer/MixedObjectTransformationTest.java
Show resolved
Hide resolved
...nsformer/src/test/java/com/expediagroup/beans/transformer/MixedObjectTransformationTest.java
Show resolved
Hide resolved
...-common/src/test/java/com/expediagroup/beans/sample/FromFooWithPrimitiveAndNestedObject.java
Show resolved
Hide resolved
…o-op, add test coverage - Extract resolveEffectiveSource() helper to centralize breadcrumb-based mapping resolution, eliminating duplication between getConstructorArgsValues and getFieldValue - Remove unnecessary Optional wrapping (ofNullable(...).orElse(null)) in favor of direct Map.get() - Add Javadoc note about ThreadLocal reentrant edge case - Add test: mutable bean setter-injection path - Add test: differing source/destination field names (x -> nestedObject.y) - Add test: zero/default primitive value maps correctly - Add test: no-mapping throws MissingFieldException - Add test: multiple root fields mapped into same nested object
|
@fborriello hey, thanks for the detailed review. pushed a commit addressing everything:
let me know if anything else needs changing |
bull-bean-transformer/src/main/java/com/expediagroup/beans/transformer/TransformerImpl.java
Outdated
Show resolved
Hide resolved
|
@vijaygovindaraja, please also add the changes as part of the |
- Add changelog entries for ExpediaGroup#559 fix in CHANGELOG.md and CHANGELOG-JDK11.md - Remove unused getSourceFieldName(String, String) two-arg overload
|
@fborriello done — added changelog entries to both files and removed the unused two-arg |
Record auto-generates equals/hashCode/toString that are not exercised by tests, causing JaCoCo method coverage to drop below the required 100% threshold.
|
@fborriello the build was failing because the thanks |
- Add Javadoc comments to fields - Rename constructor params to avoid HiddenField violation
|
|
|
@fborriello good catch, removed it. thanks |
|
@vijaygovindaraja the actions haven't triggered, would you mind doing an empty push so that we can merge this? A release of a new bull version will be performed early next week |
|
@fborriello done, pushed an empty commit to trigger the actions |
Test Coverage Report
|
Fixes #599
Summary
When using
withFieldMapping(new FieldMapping<>("x", "nestedObject.x"))to map a root-level source field into anested destination field, the transformer incorrectly looked for field
xin the nested source object (FromSubBean)instead of the root source (
FromBean), throwingMissingFieldException.Fix
ThreadLocalduring transformationnestedObject.x) against the mapping tablecurrent nested context
try/finallyto ensureThreadLocalis always removedTest
Added
testPrimitiveFieldMappedIntoNestedObjectinMixedObjectTransformationTestreproducing the exact scenariofrom the issue. All 96 functional tests pass.