Skip to content

Fissa con un test il presupposto di nullabilità di RicevutaJsonValidator - #113

Merged
pintorig merged 1 commit into
mainfrom
test/bizevents-nullabilita
Oct 13, 2026
Merged

pintorig merged 1 commit into
mainfrom
test/bizevents-nullabilita

Conversation

@pintorig

Copy link
Copy Markdown
Member

Perché

RicevutaJsonValidator esiste perché i campi required dello schema BizEvents assenti dal JSON caricato arrivano a null sull'oggetto deserializzato: il generatore OpenAPI li annota @jakarta.annotation.Nonnull e vi mette @JsonProperty(required = true), ma per Jackson sono metadati di schema, non vincoli di deserializzazione. È questo che lascia al validator il compito di intercettarli e rispondere con un 400 che li elenca, invece di un errore di parsing opaco.

Finora quel presupposto era verificato solo di rimbalzo, dal percorso completo di caricamento (RicevutaUploadIntegrationTest.jsonConCampiMancantiRitorna400ChiElencaICampi). Se un aggiornamento di Jackson lo cambiasse, il sintomo sarebbe un caricamento RT che fallisce in modo strano e la causa andrebbe ricostruita da capo. Questo test fa fallire la build nel punto esatto, dicendo cosa è cambiato.

Occasione

La migrazione a Jackson 3 (#109), che ha aggiunto useJackson3 anche all'esecuzione del generatore per il client bizevents. Ho verificato che non cambia nulla di rilevante:

  • modello rigenerato da zero: stesse annotazioni di prima (52 @Nonnull, 26 required = true, getDebtor/getPaymentAmount/getTransferList @Nonnull, getPayer @Nullable);
  • le annotazioni restano in com.fasterxml.jackson.annotation — non è migrazione incompleta, Jackson 3 ha lasciato lì di proposito le annotazioni, spostando solo databind e core sotto tools.jackson;
  • deserializzando {"receiptId":"RT1"} i campi obbligatori arrivano a null senza alcuna eccezione.

Nessuna modifica al codice di produzione è risultata necessaria.

Cosa copre

Test Cosa fissa
campiRequiredAssentiNonFannoFallireLaDeserializzazione Jackson non rifiuta il JSON incompleto
campiRequiredAssentiRestanoNullNonostanteLAnnotazioneNonnull i campi @Nonnull arrivano null
transferListAssenteArrivaVuotaNonNulla l'eccezione alla regola (vedi sotto)
ilValidatorIntercettaQuellAssenza il validator li segnala comunque tutti

L'eccezione alla regola: il generatore inizializza le liste (= new ArrayList<>()), quindi transferList assente arriva vuota e non nulla. È il motivo per cui il validator la verifica con "nulla o vuota": controllare solo la nullità lascerebbe passare una ricevuta senza alcun trasferimento. Era un dettaglio implicito, ora è scritto.

Verifica

Ho controllato che l'asserzione del quarto test non fosse vacua, inserendo temporaneamente un campo inesistente fra quelli attesi nel messaggio: il test fallisce come deve.

Suite completa: 1402 test, 0 failures, 0 errors.

🤖 Generated with Claude Code

…ator

Il validator esiste perche' i campi "required" dello schema BizEvents assenti
dal JSON caricato arrivano a null sull'oggetto deserializzato: il generatore
OpenAPI li annota @jakarta.annotation.Nonnull e vi mette
@JsonProperty(required = true), ma per Jackson sono metadati di schema, non
vincoli di deserializzazione.

Finora quel presupposto era verificato solo di rimbalzo, dal percorso
completo di caricamento (RicevutaUploadIntegrationTest.
jsonConCampiMancantiRitorna400ChiElencaICampi). Se un aggiornamento di
Jackson lo cambiasse, il sintomo sarebbe un caricamento RT che fallisce in
modo strano, e la causa andrebbe ricostruita. Qui invece il fallimento punta
dritto al punto.

Occasione: la migrazione a Jackson 3 (#109), che ha rigenerato anche il
client bizevents con useJackson3. Verificato che non cambia nulla: stesse
annotazioni sul model (52 @nonnull, 26 required), e i campi obbligatori
assenti continuano ad arrivare a null senza che la deserializzazione
fallisca.

Il test copre anche l'eccezione alla regola: il generatore inizializza le
liste, quindi transferList assente arriva vuota e non nulla, ed e' il motivo
per cui il validator la verifica con "nulla o vuota".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@pintorig
pintorig merged commit 11fae22 into main Oct 13, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant