From e3419e4d43859866bc1d334c6b05376e04190bf1 Mon Sep 17 00:00:00 2001 From: curry772 Date: Tue, 18 Aug 2026 10:06:55 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B0=80=EB=B3=80=20url=20=ED=91=9C=EC=A4=80?= =?UTF-8?q?=EC=A0=84=EB=AC=B8=ED=97=A4=EB=8D=94=EA=B0=92=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - stdHeaderGroup. prefix 사용 --- .../impl/HttpClient5AdapterServiceRest.java | 66 ++++++++++++++++--- .../http/dynamic/HttpAdapterServiceKey.java | 5 +- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java index 8939896..2cd4b40 100644 --- a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java +++ b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java @@ -71,6 +71,8 @@ import com.eactive.eai.common.util.JacksonUtil; import com.eactive.eai.common.util.RestSendBodyLogUtils; import com.eactive.eai.common.util.TxFileLogger; import com.eactive.eai.common.util.XMLUtils; +import com.eactive.eai.message.StandardItem; +import com.eactive.eai.message.StandardMessage; import com.eactive.eai.util.JsonPathUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -110,6 +112,9 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp static final String DJB_ROOTLESS_ARRAY = "{ \"DJB_ROOTLESS_ARRAY\" : "; + // URL Path Variable 이 표준전문(요청) 항목을 참조할 때 사용하는 접두어. 접두어 뒤는 표준전문 루트 기준 전체 경로. + static final String STD_MSG_VARIABLE_PREFIX = "stdHeaderGroup."; + private boolean useAdapterToken; /** @@ -242,9 +247,9 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp uri = vo.getUrl(); } else { if (dataObject == null) { - uri = changeUrl(messageType, vo.getUrl(), restOptionData, sendData, inboundPathVariables); + uri = changeUrl(messageType, vo.getUrl(), restOptionData, sendData, inboundPathVariables, tempProp); } else { - uri = changeUrl(messageType, vo.getUrl(), restOptionData, dataObject, inboundPathVariables); + uri = changeUrl(messageType, vo.getUrl(), restOptionData, dataObject, inboundPathVariables, tempProp); } } @@ -1155,7 +1160,8 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp return document; } - private String changeUrl(String messageType, String url, String restOption, Object sendData, Map inboundPathVariables) { + private String changeUrl(String messageType, String url, String restOption, Object sendData, + Map inboundPathVariables, Properties tempProp) { if ((MessageType.JSON.equals(messageType) || MessageType.XML.equals(messageType))) { try { if (StringUtils.isBlank(restOption)) { @@ -1188,19 +1194,30 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp // jsonObject = (JSONObject) JSONValue.parse((String) sendData); // } for (String urlVaribleId : uriVariables) { - String uriVariable = JsonPathUtil.getAt(jsonNode, urlVaribleId, "\\."); + String uriVariable; + if (urlVaribleId.startsWith(STD_MSG_VARIABLE_PREFIX)) { + uriVariable = getStandardMessageValue(tempProp, urlVaribleId); + } else { + uriVariable = JsonPathUtil.getAt(jsonNode, urlVaribleId, "\\."); + } // String uriVariable = null; // if( jsonObject != null ) { // uriVariable = (String) jsonObject.get(urlVaribleId); // jsonObject.remove(urlVaribleId); // } - - if (StringUtils.isBlank(uriVariable) && inboundPathVariables.containsKey(urlVaribleId)) { + + if (StringUtils.isBlank(uriVariable) && inboundPathVariables != null + && inboundPathVariables.containsKey(urlVaribleId)) { uriVariable = inboundPathVariables.get(urlVaribleId); } - + + // expand()는 이름이 아닌 순서로 매핑하므로 값이 없어도 자리를 유지해야 한다. + if (uriVariable == null) { + logger.warn("HttpClientAdapterServiceRest] uri variable not found=[" + urlVaribleId + "] "); + uriVariable = ""; + } urlVariableList.add(uriVariable); - + } } else if (MessageType.XML.equals(messageType)) { Document doc; @@ -1211,7 +1228,17 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp } for (Object tempObject : uriVariables) { String urlVaribleId = (String) tempObject; + if (urlVaribleId.startsWith(STD_MSG_VARIABLE_PREFIX)) { + String stdValue = getStandardMessageValue(tempProp, urlVaribleId); + urlVariableList.add(stdValue == null ? "" : stdValue); + continue; + } Element element = (Element) doc.selectSingleNode("//" + urlVaribleId); + if (element == null) { + logger.warn("HttpClientAdapterServiceRest] uri variable not found=[" + urlVaribleId + "] "); + urlVariableList.add(""); + continue; + } urlVariableList.add(element.getText()); if (doc.getRootElement() == element) { doc = null; @@ -1234,6 +1261,29 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp return url; } + /** + * URL Path Variable 이 {@code stdHeaderGroup.} 접두어를 가지면 요청 표준전문에서 값을 찾는다. + * + * @param tempProp 어댑터 임시 속성 (요청 표준전문 보관) + * @param urlVaribleId 접두어를 포함한 Path Variable 이름 + * @return 표준전문 항목 값. 표준전문이 없거나 항목을 찾지 못하면 null + */ + private String getStandardMessageValue(Properties tempProp, String urlVaribleId) { + Object stdMessageObject = tempProp.get(HttpAdapterServiceKey.OUT_REQ_STD_MSG); + if (!(stdMessageObject instanceof StandardMessage)) { + logger.warn("HttpClientAdapterServiceRest] request standard message not found=[" + urlVaribleId + "] "); + return null; + } + // 접두어는 표기용 이름이므로 제거한 나머지가 표준전문 루트 기준 전체 경로가 된다. + String itemPath = urlVaribleId.substring(STD_MSG_VARIABLE_PREFIX.length()); + StandardItem item = ((StandardMessage) stdMessageObject).findItem(itemPath); + if (item == null) { + logger.warn("HttpClientAdapterServiceRest] standard message item not found=[" + itemPath + "] "); + return null; + } + return item.getValue(); + } + private String getUrl(String baseUrl, String extraPath) { if (StringUtils.isBlank(extraPath)) { return baseUrl; diff --git a/src/main/java/com/eactive/eai/adapter/http/dynamic/HttpAdapterServiceKey.java b/src/main/java/com/eactive/eai/adapter/http/dynamic/HttpAdapterServiceKey.java index b3dd3cf..50536eb 100644 --- a/src/main/java/com/eactive/eai/adapter/http/dynamic/HttpAdapterServiceKey.java +++ b/src/main/java/com/eactive/eai/adapter/http/dynamic/HttpAdapterServiceKey.java @@ -85,7 +85,10 @@ public interface HttpAdapterServiceKey { //응답 처리 용 표준 전문 오브젝트 static final String STANDARD_MESSAGE_OBJECT = "STANDARD_MESSAGE_OBJECT"; - + + //송신(Outbound) 요청 표준 전문 오브젝트 + static final String OUT_REQ_STD_MSG = "OUT_REQ_STD_MSG"; + // 어댑터별 인증 키 헤더 이름 static final String ADAPTER_TOKEN_HEADER_NAME = "ADAPTER_TOKEN_HEADER_NAME"; static final String ADAPTER_APIKEY_HEADER_NAME = "ADAPTER_APIKEY_HEADER_NAME";