Merge branch 'jenkins_with_weblogic' of http://192.168.240.178:18080/eapim/eapim-online.git into jenkins_with_weblogic

This commit is contained in:
cho
2026-02-09 10:00:55 +09:00
@@ -1,12 +1,16 @@
package com.eactive.eai.adapter.controller; package com.eactive.eai.adapter.controller;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
// jwhong
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@@ -24,6 +28,8 @@ import com.eactive.eai.adapter.http.client.HttpClientAdapterServiceKey;
import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey;
import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterManager; import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterManager;
import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterUri; import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterUri;
import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter;
import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilterFactoryKjb;
import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthException; import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthException;
import com.eactive.eai.adapter.service.ApiAdapterService; import com.eactive.eai.adapter.service.ApiAdapterService;
import com.eactive.eai.common.TransactionContextKeys; import com.eactive.eai.common.TransactionContextKeys;
@@ -39,11 +45,6 @@ import com.eactive.eai.common.util.MessageUtil;
import com.eactive.eai.common.util.UUIDGenerator; import com.eactive.eai.common.util.UUIDGenerator;
import com.eactive.eai.inbound.error.InboundErrorInfoVO; import com.eactive.eai.inbound.error.InboundErrorInfoVO;
// jwhong
import org.json.simple.JSONObject;
import java.util.HashMap;
import java.util.Map;
@RestController @RestController
public class ApiAdapterController implements HttpAdapterServiceKey { public class ApiAdapterController implements HttpAdapterServiceKey {
static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER);
@@ -53,21 +54,26 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
/** /**
* KJBANK 요구사항으로 /mapi/oauth2/token 과 같은 형태로 토큰 발급거래를 수행해야해서 예외처리함 * KJBANK 요구사항으로 /mapi/oauth2/token 과 같은 형태로 토큰 발급거래를 수행해야해서 예외처리함
* @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer endpoints) *
* @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer
* endpoints)
*/ */
@RequestMapping(value = {"/api/*", "/mapi/*", "/api/*/{path:^(?!.*oauth).*$}/**", "/mapi/{path:^(?!.*oauth2).*$}/**"}) @RequestMapping(value = { "/api/*", "/mapi/*", "/api/*/{path:^(?!.*oauth).*$}/**",
"/mapi/{path:^(?!.*oauth2).*$}/**" })
// @RequestMapping(value = {"/api/**"}) // @RequestMapping(value = {"/api/**"})
public ResponseEntity<String> callApi(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception { public ResponseEntity<String> callApi(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
throws Exception {
// /ONLWeb/api/v1/public/getUserInfo.svc // /ONLWeb/api/v1/public/getUserInfo.svc
String apiUri = servletRequest.getRequestURI(); String apiUri = servletRequest.getRequestURI();
// /api/v1/public/getUserInfo.svc // /api/v1/public/getUserInfo.svc
apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath()); apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath());
apiUri = StringUtils.removeEnd(apiUri, "/"); apiUri = StringUtils.removeEnd(apiUri, "/");
//** jwhong TSEAIHS04의 api full path와 비교하여 adapter를 가져온다 // ** jwhong TSEAIHS04의 api full path와 비교하여 adapter를 가져온다
String methodAndUri = servletRequest.getMethod() + "|" + apiUri; String methodAndUri = servletRequest.getMethod() + "|" + apiUri;
HttpDynamicInAdapterUri adptUri = null; HttpDynamicInAdapterUri adptUri = null;
String bzwkSvcKeyName = ""; // Adapter Group별 Action Class에 따라 구성이 달라짐. 예) _AGW_IN_RST_SyS:POST/account/{acc_no} String bzwkSvcKeyName = ""; // Adapter Group별 Action Class에 따라 구성이 달라짐. 예)
// _AGW_IN_RST_SyS:POST/account/{acc_no}
String adapterGrpName = ""; // Adapter Group명 예) _AGW_IN_RST_SyS : API_PATH(/api/test) String adapterGrpName = ""; // Adapter Group명 예) _AGW_IN_RST_SyS : API_PATH(/api/test)
String apiSvcCode = ""; // eaiSvcCd 예) LONNCHCON00005S2 String apiSvcCode = ""; // eaiSvcCd 예) LONNCHCON00005S2
String apiFullPathKey = ""; // 예) POST|/api/test/account/list, POST|/api/test/account/{acc_no} String apiFullPathKey = ""; // 예) POST|/api/test/account/list, POST|/api/test/account/{acc_no}
@@ -89,7 +95,7 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
} catch (Exception e) { } catch (Exception e) {
adptUri = null; adptUri = null;
} }
//*** // ***
if (logger.isDebug()) { if (logger.isDebug()) {
logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI()); logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI());
@@ -97,13 +103,12 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
if (adptUri == null) { if (adptUri == null) {
logError(servletRequest); logError(servletRequest);
String errorMsg = MessageUtil.makeJsonErrorMessage(MessageUtil.ERROR_CODE_SERVICE_NOT_FOUND, "can not find Adapter Uri"); String errorMsg = MessageUtil.makeJsonErrorMessage(MessageUtil.ERROR_CODE_SERVICE_NOT_FOUND,
return ResponseEntity.status(HttpStatus.NOT_FOUND) "can not find Adapter Uri");
.contentType(MediaType.APPLICATION_JSON) return ResponseEntity.status(HttpStatus.NOT_FOUND).contentType(MediaType.APPLICATION_JSON).body(errorMsg);
.body(errorMsg);
} }
//Received time , jwhong // Received time , jwhong
long receivedTimeMillis = System.currentTimeMillis(); // 밀리세컨 단위로 보내야함 long receivedTimeMillis = System.currentTimeMillis(); // 밀리세컨 단위로 보내야함
String receivedTimeStr = String.valueOf(receivedTimeMillis); String receivedTimeStr = String.valueOf(receivedTimeMillis);
@@ -112,9 +117,9 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
AdapterGroupVO adapterGroupVO = AdapterManager.getInstance().getAdapterGroupVO(adapterGroupName); AdapterGroupVO adapterGroupVO = AdapterManager.getInstance().getAdapterGroupVO(adapterGroupName);
AdapterVO adapterVO = AdapterManager.getInstance().getAdapterVO(adapterGroupName, adapterName); AdapterVO adapterVO = AdapterManager.getInstance().getAdapterVO(adapterGroupName, adapterName);
if (adapterVO == null) { if (adapterVO == null) {
String errorMsg = MessageUtil.makeJsonErrorMessage(MessageUtil.ERROR_CODE_AP_ERROR, "Adapter not found error"); String errorMsg = MessageUtil.makeJsonErrorMessage(MessageUtil.ERROR_CODE_AP_ERROR,
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) "Adapter not found error");
.contentType(MediaType.APPLICATION_JSON) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(MediaType.APPLICATION_JSON)
.body(errorMsg); .body(errorMsg);
} }
@@ -136,25 +141,29 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
} }
try { try {
String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO,
// if (RESPONSE_TYPE_ASYNC.equals(responseType)) { // table의 값이 ASYNC 로 들어가 있는데 response_type_async는 ASYN 로 되어 있어 아래처럼 비교함 jwhong 2025 transactionProp);
// if (RESPONSE_TYPE_ASYNC.equals(responseType)) { // table의 값이 ASYNC 로 들어가 있는데
// response_type_async는 ASYN 로 되어 있어 아래처럼 비교함 jwhong 2025
if ("ASYNC".equals(responseType)) { if ("ASYNC".equals(responseType)) {
//responseEntity = ResponseEntity.ok("dummy"); // comment by jwhong // responseEntity = ResponseEntity.ok("dummy"); // comment by jwhong
//servletResponse.addHeader("traceId", responseData); // uuid를 response header에 // servletResponse.addHeader("traceId", responseData); // uuid를 response header에
servletResponse.addHeader("traceId", transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에 servletResponse.addHeader("traceId",
transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에
int httpStatus = servletResponse.getStatus(); int httpStatus = servletResponse.getStatus();
if (httpStatus == 200) { if (httpStatus == 200) {
// 업체별 aync response message 가 다르다. // 업체별 aync response message 가 다르다.
String asyncMsgStyle = httpProp.getProperty("ASYNC_RTNMSG_TYPE", ""); String asyncMsgStyle = httpProp.getProperty("ASYNC_RTNMSG_TYPE", "");
String responseBody =""; String responseBody = "";
boolean encryptAsyncAckApply = StringUtils.equalsIgnoreCase(httpProp.getProperty("ASYNC_ENCRYPT_ACK", "N"), "Y"); boolean encryptAsyncAckApply = StringUtils
.equalsIgnoreCase(httpProp.getProperty("ASYNC_ENCRYPT_ACK", "N"), "Y");
if (asyncMsgStyle == null || asyncMsgStyle.trim().isEmpty()) { if (asyncMsgStyle == null || asyncMsgStyle.trim().isEmpty()) {
responseBody = makeResponseBodyMsg(); responseBody = makeResponseBodyMsg();
} else { } else {
responseBody = asyncMsgStyle; responseBody = asyncMsgStyle;
} }
if ( encryptAsyncAckApply) { if (encryptAsyncAckApply) {
responseBody = service.doPostEncryption(responseBody, transactionProp, servletRequest); responseBody = service.doPostEncryption(responseBody, transactionProp, servletRequest);
} }
@@ -168,7 +177,8 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
// 버즈빌 포인트 적립 처리하기 위하여 정상응답이더라도 응답코드(apiRsltCd) 값이 200이 아닌 경우 처리를 위하여 수정 // 버즈빌 포인트 적립 처리하기 위하여 정상응답이더라도 응답코드(apiRsltCd) 값이 200이 아닌 경우 처리를 위하여 수정
// Filter에서 설정한 response status값을 responseEntity 생성시 적용 modify by lwk 2025.03.24 // Filter에서 설정한 response status값을 responseEntity 생성시 적용 modify by lwk 2025.03.24
servletResponse.addHeader("traceId", transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에 servletResponse.addHeader("traceId",
transactionProp.getProperty(TransactionContextKeys.TRANSACTION_UUID)); // uuid를 response header에
int httpStatus = servletResponse.getStatus(); int httpStatus = servletResponse.getStatus();
if (httpStatus != 200) { if (httpStatus != 200) {
responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData);
@@ -177,25 +187,46 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
} }
} }
} catch (HttpStatusException e) {
logger.warn("ApiAdapterController] " + adapterGroupName + "-" + adapterName + ">>" + e.getMessage());
String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, MessageUtil.ERROR_CODE_AP_ERROR,
e.getMessage(), errorResponseFormat);
responseEntity = ResponseEntity.status(e.getStatus()).contentType(mediaType).body(errorMsg);
} catch (JwtAuthException e) {
logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e);
String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, MessageUtil.ERROR_CODE_AUTH_FAIL,
e.getMessage(), errorResponseFormat);
responseEntity = ResponseEntity.status(HttpStatus.UNAUTHORIZED).contentType(mediaType).body(errorMsg);
} catch (Exception e) { } catch (Exception e) {
logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e); logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e);
String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, MessageUtil.ERROR_CODE_AP_ERROR,
e.getMessage(), errorResponseFormat); String errorMsg = null;
responseEntity = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(mediaType).body(errorMsg);
if( e instanceof HttpStatusException ) {
logger.warn("ApiAdapterController] " + adapterGroupName + "-" + adapterName + ">>" + e.getMessage());
HttpStatusException e1 = (HttpStatusException) e;
errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode,
MessageUtil.ERROR_CODE_AP_ERROR, e1.getMessage(), errorResponseFormat);
responseEntity = ResponseEntity.status(e1.getStatus()).contentType(mediaType).body(errorMsg);
}
else if( e instanceof JwtAuthException )
{
logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e);
errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode,
MessageUtil.ERROR_CODE_AUTH_FAIL, e.getMessage(), errorResponseFormat);
responseEntity = ResponseEntity.status(HttpStatus.UNAUTHORIZED).contentType(mediaType).body(errorMsg);
}
else
{
logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e);
errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode,
MessageUtil.ERROR_CODE_AP_ERROR, e.getMessage(), errorResponseFormat);
responseEntity = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(mediaType)
.body(errorMsg);
}
String postFilterNames = httpProp.getProperty("POST_FILTERS","");
if( postFilterNames.contains("HMAC_SHA256") ) {
HttpAdapterFilter filter = HttpAdapterFilterFactoryKjb.createFilter("HMAC_SHA256");
filter.doPostFilter(adapterGrpName, postFilterNames, errorMsg, transactionProp, servletRequest, servletResponse);
}
} finally { } finally {
/** /**
* 로깅 인터셉터에 데이터를 전달하기 위한 처리 * 로깅 인터셉터에 데이터를 전달하기 위한 처리 이미 거래처리가 끝나서 영향도가 없을만한 servletRequest에 Attribute로 전달
* 이미 거래처리가 끝나서 영향도가 없을만한 servletRequest에 Attribute로 전달
* 추후 더 좋은방법이 생길경우 개선 요망 * 추후 더 좋은방법이 생길경우 개선 요망
*/ */
servletRequest.setAttribute(TransactionContextKeys.TRANSACTION_PROP, transactionProp); servletRequest.setAttribute(TransactionContextKeys.TRANSACTION_PROP, transactionProp);
@@ -210,17 +241,17 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
// 응답 헤더 로깅 // 응답 헤더 로깅
for (String headerName : servletResponse.getHeaderNames()) { for (String headerName : servletResponse.getHeaderNames()) {
String headerValue = servletResponse.getHeader(headerName); String headerValue = servletResponse.getHeader(headerName);
logger.debug(String.format( "httpHeader logging headerKey=%s, headerValue=%s", headerName, headerValue)); logger.debug(
String.format("httpHeader logging headerKey=%s, headerValue=%s", headerName, headerValue));
headerMap.put(headerName, headerValue); headerMap.put(headerName, headerValue);
} }
HttpAdapterExtraLogUtil.insertHttpAdapterExtraLog(uuid, 400, adapterGroupName, adapterName, headerMap, url, method, httpStatusCode); HttpAdapterExtraLogUtil.insertHttpAdapterExtraLog(uuid, 400, adapterGroupName, adapterName, headerMap,
url, method, httpStatusCode);
} }
} }
return responseEntity; return responseEntity;
} }
/** /**
* url에서 뒤쪽 /이후를 제거하면서 찾는다.<br> * url에서 뒤쪽 /이후를 제거하면서 찾는다.<br>
* /api/v1/public/getUserInfo.svc * /api/v1/public/getUserInfo.svc
@@ -228,22 +259,21 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
* @param apiUri * @param apiUri
* @return * @return
*/ */
private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager, String adapterGrpName) throws Exception { private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager,
String adapterGrpName) throws Exception {
if (StringUtils.isBlank(apiUri)) { if (StringUtils.isBlank(apiUri)) {
return null; return null;
} }
//* manager 출력 // * manager 출력
logger.warn("===== adptUriMap 상세 내용 ====="); logger.warn("===== adptUriMap 상세 내용 =====");
for (Map.Entry<String, HttpDynamicInAdapterUri> entry : manager.adptUriMap.entrySet()) { for (Map.Entry<String, HttpDynamicInAdapterUri> entry : manager.adptUriMap.entrySet()) {
HttpDynamicInAdapterUri uriObj = entry.getValue(); HttpDynamicInAdapterUri uriObj = entry.getValue();
logger.warn("GroupName=" + uriObj.getAdptGrpName() logger.warn("GroupName=" + uriObj.getAdptGrpName() + ", AdapterName=" + uriObj.getAdptName() + ", URI="
+ ", AdapterName=" + uriObj.getAdptName() + uriObj.getUri());
+ ", URI=" + uriObj.getUri());
} }
logger.warn("================================"); logger.warn("================================");
// //
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
HttpDynamicInAdapterUri adptUri = manager.getAdptUri(apiUri); HttpDynamicInAdapterUri adptUri = manager.getAdptUri(apiUri);
@@ -296,7 +326,6 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
InboundErrorLogger.error(errorInfoVO); InboundErrorLogger.error(errorInfoVO);
} }
private String makeResponseBodyMsg() { private String makeResponseBodyMsg() {
Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>();
@@ -313,34 +342,20 @@ public class ApiAdapterController implements HttpAdapterServiceKey {
return json.toJSONString(); return json.toJSONString();
} }
/* /*
private String makeResponseBodyMsg(String asyncMsgStyle) { * private String makeResponseBodyMsg(String asyncMsgStyle) {
*
Map<String, Object> dataMap = new HashMap<>(); * Map<String, Object> dataMap = new HashMap<>(); dataMap.put("result", 1);
dataMap.put("result", 1); * Map<String, Object> map = new HashMap<>();
Map<String, Object> map = new HashMap<>(); *
* switch (asyncMsgStyle) { case "TB_SUC": map.put("rspCode", "TB_SUC_000");
switch (asyncMsgStyle) { * map.put("rspMsg", "정상"); map.put("data", dataMap); break; case "ONLYDATA":
case "TB_SUC": * map.put("data", dataMap); map.put("success", "true"); break; default:
map.put("rspCode", "TB_SUC_000"); * map.put("code", "200"); map.put("data", dataMap); map.put("message",
map.put("rspMsg", "정상"); * "정상 처리 되었습니다."); break; }
map.put("data", dataMap); *
break; * JSONObject json = new JSONObject(); json.putAll(map);
case "ONLYDATA": *
map.put("data", dataMap); * return json.toJSONString(); }
map.put("success", "true");
break;
default:
map.put("code", "200");
map.put("data", dataMap);
map.put("message", "정상 처리 되었습니다.");
break;
}
JSONObject json = new JSONObject();
json.putAll(map);
return json.toJSONString();
}
*/ */
} }