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; }