Repository navigation
Commit 4ccdd2e
fix(codegen-spring): a POST must not validate the server-generated key out of the body
No Java adopter could create anything through the generated API for an entity
whose primary key is `@required` — the shape every real model has, because a
shared BaseEntity declares `id` required. The vanilla create handler validated
the whole request DTO:
if (!validator.validate(dto).isEmpty()) -> 400 {"error":"validation"}
SpringDtoGenerator emits ONE record for both request and response, so a
`@required` PK earns @NotNull — true of the RESPONSE, false of the request,
because `identity.primary @generation:uuid` means the database supplies the key.
Proven against a running port with two requests: the body an adopter sends 400s,
the same body plus a client-invented id 201s. The only workaround defeated the
declared key strategy.
The generator already knew the rule. settableFields() returns "effective scalars
MINUS the primary key MINUS the discriminator" and its javadoc says the PK "is
auto-generated ... so neither is validated from the body" — applied on the TPH
create path and to <Entity>Patch, never on the vanilla one. That is why a TPH
entity POSTed fine while a plain one did not: same model, same generator, two
write paths, one of which had learned the rule.
The vanilla create now emits SERVER_OWNED_ON_CREATE (primary-key components plus
@autoset) and filters violations by top-level property name. validate(dto) is
KEPT rather than narrowed to per-property validateValue, because it is what
cascades @Valid into nested value objects: the violations are filtered, not the
validation weakened, and a nested path like "labels[0].code" cannot match a
top-level name, so cascaded constraints still reject. An entity with no
server-owned component keeps its previous handler byte-for-byte.
No gate could have caught this. The api-contract corpus's only entity declares
Author.id with NO @required, and SpringControllerGeneratorTest's AUTHOR_FIXTURE
has the same blind spot — so the DTO never annotated the key, the guard had
nothing to over-reject, and both lanes stayed green in all five ports. The new
REQUIRED_PK_FIXTURE carries the shape they lacked; making the shared corpus PK
@required is recommended separately, since widening a cross-port gate may turn
other ports red and is a decision to take knowingly.
Found by building a Java adopter app against the published plugin.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015NrWUxA6euwvnFcwKxcK6A1 parent 3e1a8c0 commit 4ccdd2e
3 files changed
Lines changed: 188 additions & 1 deletion
File tree
- server/java/codegen-spring/src
- main/java/com/metaobjects/generator/spring
- test/java/com/metaobjects/generator/spring
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
189 | 189 | | |
190 | 190 | | |
191 | 191 | | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
192 | 221 | | |
193 | 222 | | |
194 | 223 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
227 | 227 | | |
228 | 228 | | |
229 | 229 | | |
| 230 | + | |
230 | 231 | | |
231 | 232 | | |
232 | 233 | | |
| |||
296 | 297 | | |
297 | 298 | | |
298 | 299 | | |
299 | | - | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
300 | 325 | | |
301 | 326 | | |
302 | 327 | | |
| |||
941 | 966 | | |
942 | 967 | | |
943 | 968 | | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
944 | 1012 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
246 | 246 | | |
247 | 247 | | |
248 | 248 | | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
249 | 339 | | |
0 commit comments