From 78606514ad9a1d5094509e45753cea4f3d93a3bb Mon Sep 17 00:00:00 2001 From: curry772 Date: Fri, 28 Aug 2026 16:41:21 +0900 Subject: [PATCH] =?UTF-8?q?newNumberSafeMapper=20=EC=97=90=20=EC=84=A0?= =?UTF-8?q?=ED=96=89=200=20=EC=88=AB=EC=9E=90=20=ED=97=88=EC=9A=A9=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상대 시스템이 0 패딩된 코드값을 따옴표 없이(=JSON 숫자로) 보내면 표준 파서가 "Invalid numeric value: Leading zeroes not allowed" 로 전문 전체를 거부한다. 전문을 못 읽고 실패하는 것보다 값을 받아들이는 쪽이 낫다고 판단해 ALLOW_LEADING_ZEROS_FOR_NUMBERS 를 켠다. newNumberSafeMapper() 한 곳에 넣어 이를 쓰는 전 경로(JsonReader 표준전문, JacksonUtil.OBJECT_MAPPER 를 타는 어댑터/필터)를 함께 덮는다. WRITE_BIGDECIMAL_AS_PLAIN 을 여기 넣었던 것과 같은 이유다. 주의: 이 옵션은 00001 을 숫자 1 로 만든다(선행 0 미보존). 항목이 NUMBER/LL_NUMBER 로 선언돼 있으면 StandardItem.toTypeValue() 가 어차피 선행 0 을 깎으므로 결과가 같고, STRING/ZZ_STRING 선언이면 자릿수가 사라진다. 후자는 상대에게 따옴표를 붙여 보내달라고 요청하는 것이 정답이다. Jackson 2.12.7 실측: 선행 0 파싱 8종, 숫자 정밀도 왕복 5종, 제어문자 정규화 조합, 과허용 여부(+1 / .5 / 무따옴표키 / 홑따옴표는 여전히 거부) 19건 PASS. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Phh6MSGvgHM3rPgGUU3dzR --- .../com/eactive/eai/common/util/JacksonUtil.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/eactive/eai/common/util/JacksonUtil.java b/src/main/java/com/eactive/eai/common/util/JacksonUtil.java index 9b08048..78be774 100644 --- a/src/main/java/com/eactive/eai/common/util/JacksonUtil.java +++ b/src/main/java/com/eactive/eai/common/util/JacksonUtil.java @@ -7,6 +7,7 @@ import java.util.regex.Pattern; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; @@ -58,12 +59,26 @@ public final class JacksonUtil { * 0.00000012 -> 1.2E-7 , -0.0000005 -> -5E-7 * 금액처럼 scale 이 0 이상인 큰 값은 영향이 없지만, 이율/환율은 깨진다. * (Jackson 2.12.7 실측, 2026-08-27) + * + * 선행 0 허용 - ALLOW_LEADING_ZEROS_FOR_NUMBERS. + * JSON 표준은 숫자의 선행 0 을 금지하므로, 상대가 0 패딩된 코드값을 따옴표 없이 보내면 + * 파서가 아래 오류로 거부한다. + * Invalid numeric value: Leading zeroes not allowed + * 전문 자체를 못 읽고 실패하는 것보다 값을 받아들이는 쪽이 낫다고 판단해 옵션으로 허용한다. + * ⚠ 이 옵션은 00001 을 숫자 1 로 만든다. 즉 선행 0 은 보존되지 않는다. + * - 표준전문 항목이 NUMBER/LL_NUMBER 로 선언돼 있으면 StandardItem.toTypeValue() 가 + * 어차피 선행 0 을 깎으므로 결과가 같다. + * - STRING/ZZ_STRING 으로 선언된 0 패딩 코드값이라면 자릿수가 사라진다. + * 그런 항목은 상대에게 따옴표를 붙여 보내달라고 요청하는 것이 정답이다. + * (Jackson 2.12.7 실측, 2026-08-28) */ public static ObjectMapper newNumberSafeMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); objectMapper.setNodeFactory(JsonNodeFactory.withExactBigDecimals(true)); objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); + objectMapper.getFactory().configure( + JsonReadFeature.ALLOW_LEADING_ZEROS_FOR_NUMBERS.mappedFeature(), true); return objectMapper; }