From c5bf45cad989ff446c88d8399a8eb854de0c214d Mon Sep 17 00:00:00 2001 From: curry772 Date: Thu, 27 Aug 2026 18:09:39 +0900 Subject: [PATCH] =?UTF-8?q?custom=20=EC=96=B4=EB=8C=91=ED=84=B0/=EB=B3=80?= =?UTF-8?q?=ED=99=98=ED=95=A8=EC=88=98=EC=9D=98=20Jackson=20mapper=20?= =?UTF-8?q?=EB=A5=BC=20number-safe=20=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기본 ObjectMapper 는 JSON 숫자 왕복에서 값을 변형한다 (100000000.00 -> 1.0E8, 0.00000012 -> 1.2E-7). payload 를 다루는 지점을 JacksonUtil.newNumberSafeMapper() 로 맞춘다. - KakaopayAdapterErrorMsgHandler: 응답 JSON 파싱/왕복 지점 전환 - HttpClient5AdapterServiceBigTechAddFilter: JsonNode 직렬화 지점 전환 - KakaopayFilter: JacksonUtil.readTree(message, OBJECT_MAPPER) 로 plain mapper 를 넘기고 있어 유틸을 써도 파싱이 깨졌다. 인자 1개 오버로드(number-safe 싱글턴)를 쓰도록 바꾸고 plain 필드 제거 - JsonPathExtractRequestMessage: 미사용으로 보였던 objectMapper 필드는 사실 연결이 빠진 것이었다. JsonPath 의 기본 JacksonJsonNodeJsonProvider() 가 내부적으로 plain ObjectMapper 를 쓰기 때문에 JSON 실수가 DoubleNode 로 파싱되어 resultNode.asText() 가 "1.0E8" 을 반환했다. 프로바이더에 number-safe mapper 를 주입해 해결 - NaverpayAdapterErrorMsgHandler: Kakaopay 판을 복사하며 딸려온 미사용 필드/import 제거. 이 핸들러는 JSON 을 파싱하지 않고 StandardMessage 로만 응답을 만든다 검증: gradlew compileJava BUILD SUCCESSFUL --- .../adapter/handler/KakaopayAdapterErrorMsgHandler.java | 4 +++- .../adapter/handler/NaverpayAdapterErrorMsgHandler.java | 4 ---- .../impl/HttpClient5AdapterServiceBigTechAddFilter.java | 4 +++- .../adapter/http/dynamic/filter/KakaopayFilter.java | 6 ++---- .../userdefined/JsonPathExtractRequestMessage.java | 8 +++++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/eactive/eai/custom/adapter/handler/KakaopayAdapterErrorMsgHandler.java b/src/main/java/com/eactive/eai/custom/adapter/handler/KakaopayAdapterErrorMsgHandler.java index fdf17e6..735d06b 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/handler/KakaopayAdapterErrorMsgHandler.java +++ b/src/main/java/com/eactive/eai/custom/adapter/handler/KakaopayAdapterErrorMsgHandler.java @@ -10,6 +10,7 @@ import com.eactive.eai.adapter.handler.TemplateCodeConvertAdapterErrorMsgHandler import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; import com.eactive.eai.common.message.EAIMessage; import com.eactive.eai.common.message.EAIMessageKeys; +import com.eactive.eai.common.util.JacksonUtil; import com.eactive.eai.common.util.Logger; import com.eactive.eai.custom.message.StandardMessageCoordinatorDJB; import com.eactive.eai.message.StandardItem; @@ -23,7 +24,8 @@ public class KakaopayAdapterErrorMsgHandler extends TemplateCodeConvertAdapterEr private static final Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + // 기본 ObjectMapper 는 응답 JSON 왕복에서 100000000.00 을 1.0E8 로 바꿔버린다. + private static final ObjectMapper OBJECT_MAPPER = JacksonUtil.newNumberSafeMapper(); @Override public Object generateNonStandardErrorResponseMessage(String inboundAdapterGroupName, String inboundAdapterName, diff --git a/src/main/java/com/eactive/eai/custom/adapter/handler/NaverpayAdapterErrorMsgHandler.java b/src/main/java/com/eactive/eai/custom/adapter/handler/NaverpayAdapterErrorMsgHandler.java index f5275d5..6e80457 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/handler/NaverpayAdapterErrorMsgHandler.java +++ b/src/main/java/com/eactive/eai/custom/adapter/handler/NaverpayAdapterErrorMsgHandler.java @@ -15,15 +15,11 @@ import com.eactive.eai.message.StandardItem; import com.eactive.eai.message.StandardMessage; import com.eactive.eai.message.manager.StandardMessageManager; import com.eactive.eai.message.service.InterfaceMapper; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; public class NaverpayAdapterErrorMsgHandler extends TemplateAdapterErrorMsgHandler { private static final Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - /** * 표준 -> 비표준 거래 * 아웃바운드 어댑터에서 Exception이 발생했을 때, Outbound Process 응답 메시지 생성 diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/HttpClient5AdapterServiceBigTechAddFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/HttpClient5AdapterServiceBigTechAddFilter.java index 9ef9ad9..7dcb0aa 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/HttpClient5AdapterServiceBigTechAddFilter.java +++ b/src/main/java/com/eactive/eai/custom/adapter/http/client/impl/HttpClient5AdapterServiceBigTechAddFilter.java @@ -9,6 +9,7 @@ import org.json.simple.JSONObject; import com.eactive.eai.adapter.http.client.HttpClientAdapterServiceKey; import com.eactive.eai.adapter.http.client.impl.filter.HttpClient5AdapterFilterFactory; import com.eactive.eai.adapter.http.client.impl.filter.HttpClientAdapterFilter; +import com.eactive.eai.common.util.JacksonUtil; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -36,7 +37,8 @@ public class HttpClient5AdapterServiceBigTechAddFilter extends HttpClient5Adapte // // Adapter에서 Exception이 발생한 경우, 처리할 필터 // static final String EXCEPTION_FILTER = "EXCEPTION_FILTER"; - private ObjectMapper mapper = new ObjectMapper(); + // 기본 ObjectMapper 는 JsonNode 직렬화 시 작은 소수를 1.2E-7 로 바꿔버린다. + private ObjectMapper mapper = JacksonUtil.newNumberSafeMapper(); /** * 1. 기능 : HttpClient 호출 전후 Filter 적용용 2. 처리 개요 :
diff --git a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java index cfc2e30..8ded88d 100644 --- a/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java +++ b/src/main/java/com/eactive/eai/custom/adapter/http/dynamic/filter/KakaopayFilter.java @@ -9,20 +9,18 @@ import com.eactive.eai.adapter.http.dynamic.filter.FilterException; import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter; import com.eactive.eai.common.util.JacksonUtil; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; /** * 카카오뱅크 암복호화에 맟추어 커스텀 필요 */ public class KakaopayFilter implements HttpAdapterFilter { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - @Override public Object doPreFilter(String adptGrpName, String adptName, Object message, Properties prop, HttpServletRequest request, HttpServletResponse response) throws Exception { - JsonNode rootNode = JacksonUtil.readTree(message, OBJECT_MAPPER); + // 인자 1개 오버로드는 JacksonUtil 내부의 number-safe 싱글턴 mapper 를 쓴다. + JsonNode rootNode = JacksonUtil.readTree(message); // term_agreements[0].is_agreed 값이 true 인지 확인 boolean firstAgreed = JacksonUtil.getBoolean(rootNode, "term_agreements[0].is_agreed", false); diff --git a/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/JsonPathExtractRequestMessage.java b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/JsonPathExtractRequestMessage.java index 4447414..aefe43d 100644 --- a/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/JsonPathExtractRequestMessage.java +++ b/src/main/java/com/eactive/eai/custom/transformer/function/userdefined/JsonPathExtractRequestMessage.java @@ -1,12 +1,12 @@ package com.eactive.eai.custom.transformer.function.userdefined; import com.eactive.eai.common.context.ElinkTransactionContext; +import com.eactive.eai.common.util.JacksonUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider; -import com.jayway.jsonpath.spi.json.JacksonJsonProvider; import org.nfunk.jep.ParseException; import org.nfunk.jep.function.PostfixMathCommand; @@ -14,7 +14,9 @@ import java.util.Stack; public class JsonPathExtractRequestMessage extends PostfixMathCommand { - private static final ObjectMapper objectMapper = new ObjectMapper(); + // JsonPath 의 기본 Jackson 프로바이더는 기본 ObjectMapper 를 쓴다. 그러면 JSON 실수가 + // DoubleNode 로 파싱되어, 아래 asText() 결과가 100000000.00 -> "1.0E8" 로 깨진다. + private static final ObjectMapper objectMapper = JacksonUtil.newNumberSafeMapper(); public JsonPathExtractRequestMessage() { numberOfParameters = -1; @@ -33,7 +35,7 @@ public class JsonPathExtractRequestMessage extends PostfixMathCommand { try { // Jackson을 JsonPath의 JSON 프로바이더로 설정 Configuration config = Configuration.builder() - .jsonProvider(new JacksonJsonNodeJsonProvider()) + .jsonProvider(new JacksonJsonNodeJsonProvider(objectMapper)) .build(); JsonNode resultNode = JsonPath.using(config).parse(bizData).read(path);