Commit 07a9150
fix(fr-036): Java TPH per-subtype CREATE validates present values — review finding #6
The TPH per-subtype create bound the annotation-free union <Base>Dto and called
repository.createWithType with NO validation, so an over-@maxlength (or missing
@required) value on a TPH POST was accepted 201 — while TS/C#/Python validate TPH
create. Fix: the generated per-subtype create now validates each body value
against the subtype's ANNOTATED <Sub>Dto via
validator.validateValue(<Sub>Dto.class, field, dto.<field>()) → 400
{"error":"validation"} before persisting (validateValue applies @NotNull to null,
so an absent @required column 400s too — matching the vanilla create's whole-bean
validate, scoped to the subtype). The bound body stays the union (the shape
createWithType consumes); the validated set is the sibling <Sub>Patch's settable
fields (SpringDtoGenerator.settableFields made public static for that SSOT).
New shared gate fixtures/api-contract-conformance/tph/scenarios/
tph-create-constraint-violation.yaml (over-@maxlength reference on a per-subtype
POST → 400; valid → 201). TS/C#/Python already pass it; Kotlin follows.
Verified: codegen-spring 165/165; TPH generated lane 7/7 (incl. the new scenario);
vanilla generated lane 25/25.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NGQ7oSuNcjhsMHWwZzhBwr1 parent 361b3e1 commit 07a9150
3 files changed
Lines changed: 80 additions & 4 deletions
File tree
- fixtures/api-contract-conformance/tph/scenarios
- server/java/codegen-spring/src/main/java/com/metaobjects/generator/spring
Lines changed: 51 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
Lines changed: 22 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
377 | 377 | | |
378 | 378 | | |
379 | 379 | | |
380 | | - | |
| 380 | + | |
| 381 | + | |
381 | 382 | | |
382 | 383 | | |
383 | 384 | | |
| |||
547 | 548 | | |
548 | 549 | | |
549 | 550 | | |
550 | | - | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
551 | 564 | | |
552 | | - | |
| 565 | + | |
553 | 566 | | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
554 | 573 | | |
555 | 574 | | |
556 | 575 | | |
| |||
Lines changed: 7 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
284 | 290 | | |
285 | | - | |
| 291 | + | |
286 | 292 | | |
287 | 293 | | |
288 | 294 | | |
| |||
0 commit comments