가변 url 표준전문헤더값 추출 기능 추가

- stdHeaderGroup. prefix 사용
This commit is contained in:
curry772
2026-08-18 10:06:55 +09:00
parent f11d27e05e
commit e3419e4d43
2 changed files with 62 additions and 9 deletions
@@ -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<String, String> inboundPathVariables) {
private String changeUrl(String messageType, String url, String restOption, Object sendData,
Map<String, String> 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;
@@ -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";