From 9282e46a0270821741a5ee1e162d7b560ddb55a4 Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 13 Apr 2026 12:27:20 +0200 Subject: [PATCH] fix(ocr): handle unknown NDJSON fields with @JsonIgnoreProperties Added @JsonIgnoreProperties(ignoreUnknown = true) to OcrBlockResult so new fields from the Python OCR service don't crash the Java parser, while keeping FAIL_ON_UNKNOWN_PROPERTIES strict globally. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../familienarchiv/service/OcrBlockResult.java | 3 +++ .../service/RestClientOcrClientStreamTest.java | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/OcrBlockResult.java b/backend/src/main/java/org/raddatz/familienarchiv/service/OcrBlockResult.java index e01b7def..b091f145 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/OcrBlockResult.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/OcrBlockResult.java @@ -1,7 +1,10 @@ package org.raddatz.familienarchiv.service; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import java.util.List; +@JsonIgnoreProperties(ignoreUnknown = true) public record OcrBlockResult( int pageNumber, double x, diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/RestClientOcrClientStreamTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/RestClientOcrClientStreamTest.java index 36d5db22..2812f0bf 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/RestClientOcrClientStreamTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/RestClientOcrClientStreamTest.java @@ -98,6 +98,23 @@ class RestClientOcrClientStreamTest { assertThat(events).hasSize(2); } + @Test + void parseNdjsonStream_handlesUnknownFieldsInBlocks() { + String ndjson = """ + {"type":"start","totalPages":1} + {"type":"page","pageNumber":0,"blocks":[{"pageNumber":0,"x":0.1,"y":0.2,"width":0.8,"height":0.1,"polygon":null,"text":"Line 1","confidence":0.95,"newFutureField":"ignored"}]} + {"type":"done","totalBlocks":1,"skippedPages":0} + """; + InputStream stream = new ByteArrayInputStream(ndjson.getBytes(StandardCharsets.UTF_8)); + + List events = new ArrayList<>(); + RestClientOcrClient.parseNdjsonStream(stream, events::add); + + assertThat(events).hasSize(3); + var page = (OcrStreamEvent.Page) events.get(1); + assertThat(page.blocks().get(0).text()).isEqualTo("Line 1"); + } + @Test void parseNdjsonStream_parsesPageWithPolygon() { String ndjson = """