newNumberSafeMapper 에 선행 0 숫자 허용 옵션 추가
상대 시스템이 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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Phh6MSGvgHM3rPgGUU3dzR
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user