diff --git a/WebContent/WEB-INF/applicationContext-jpa.xml b/WebContent/WEB-INF/applicationContext-jpa.xml index 8da5bda..e0b19cd 100644 --- a/WebContent/WEB-INF/applicationContext-jpa.xml +++ b/WebContent/WEB-INF/applicationContext-jpa.xml @@ -20,7 +20,12 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd "> - + + + + diff --git a/WebContent/WEB-INF/authserver-servlet.xml b/WebContent/WEB-INF/authserver-servlet.xml index 58f4c31..f301418 100644 --- a/WebContent/WEB-INF/authserver-servlet.xml +++ b/WebContent/WEB-INF/authserver-servlet.xml @@ -17,6 +17,10 @@ http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> + + + + + + \ No newline at end of file diff --git a/WebContent/WEB-INF/properties/env.D.properties b/WebContent/WEB-INF/properties/env.D.properties index 0bd3db5..181b796 100644 --- a/WebContent/WEB-INF/properties/env.D.properties +++ b/WebContent/WEB-INF/properties/env.D.properties @@ -20,3 +20,6 @@ eai.systemmode=D eai.systemtype=API eai.tableowner=AGWADM eai.server.extractor=[0,2],[0,2],[-2] + +# DJErp API Adapter request mapping paths (comma-separated) +dj.erp.adapter.paths=/dj/{path:^(?!oauth).*$},/dj/{path:^(?!oauth).*$}/** diff --git a/WebContent/WEB-INF/properties/env.P.properties b/WebContent/WEB-INF/properties/env.P.properties index d4b10f6..c721a3c 100644 --- a/WebContent/WEB-INF/properties/env.P.properties +++ b/WebContent/WEB-INF/properties/env.P.properties @@ -12,3 +12,6 @@ hibernate.dialect=org.hibernate.dialect.Oracle12cDialect eai.systemtype=API eai.server.extractor=[0,2],[0,2],[-2] +# DJErp API Adapter request mapping paths (comma-separated) +dj.erp.adapter.paths=/dj/{path:^(?!oauth).*$},/dj/{path:^(?!oauth).*$}/** + diff --git a/WebContent/WEB-INF/properties/env.T.properties b/WebContent/WEB-INF/properties/env.T.properties index dcc97b8..993b717 100644 --- a/WebContent/WEB-INF/properties/env.T.properties +++ b/WebContent/WEB-INF/properties/env.T.properties @@ -18,3 +18,6 @@ eai.systemmode=D eai.systemtype=API eai.tableowner=dapigw eai.server.extractor=[0,2],[0,2],[-2] + +# DJErp API Adapter request mapping paths (comma-separated) +dj.erp.adapter.paths=/dj/{path:^(?!oauth).*$},/dj/{path:^(?!oauth).*$}/** diff --git a/src/main/java/com/eactive/eai/adapter/controller/DJErpAdapterMappingRegistrar.java b/src/main/java/com/eactive/eai/adapter/controller/DJErpAdapterMappingRegistrar.java new file mode 100644 index 0000000..3dedffc --- /dev/null +++ b/src/main/java/com/eactive/eai/adapter/controller/DJErpAdapterMappingRegistrar.java @@ -0,0 +1,91 @@ +package com.eactive.eai.adapter.controller; + +import java.lang.reflect.Method; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import com.eactive.eai.common.util.Logger; + +/** + * properties 파일의 dj.erp.adapter.paths 값을 읽어 + * DJErpApiAdapterController 의 callApi 메서드를 동적으로 URL에 등록한다. + * + * 경로는 쉼표로 구분하여 여러 개를 지정할 수 있다. + * 예) /dj/{path:^(?!oauth).*$},/dj/{path:^(?!oauth).*$}/** + */ +public class DJErpAdapterMappingRegistrar implements ApplicationListener { + + static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + @Autowired + private DJErpApiAdapterController djErpApiAdapterController; + + private String paths; + + private boolean registered = false; + + public void setPaths(String paths) { + this.paths = paths; + } + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + if (registered) { + return; + } + + if (StringUtils.isBlank(paths)) { + logger.warn("DJErpAdapterMappingRegistrar] dj.erp.adapter.paths 가 설정되지 않았습니다."); + return; + } + + // OAuth2의 FrameworkEndpointHandlerMapping 을 제외하고 MVC 기본 매핑만 선택 + Map candidates = + event.getApplicationContext().getBeansOfType(RequestMappingHandlerMapping.class); + + RequestMappingHandlerMapping requestMappingHandlerMapping = candidates.values().stream() + .filter(m -> m.getClass() == RequestMappingHandlerMapping.class) + .findFirst() + .orElse(null); + + if (requestMappingHandlerMapping == null) { + logger.warn("DJErpAdapterMappingRegistrar] RequestMappingHandlerMapping 을 찾을 수 없습니다."); + return; + } + + try { + Method callApi = DJErpApiAdapterController.class.getDeclaredMethod( + "callApi", HttpServletRequest.class, HttpServletResponse.class); + + RequestMappingInfo.BuilderConfiguration options = new RequestMappingInfo.BuilderConfiguration(); + options.setPatternParser(requestMappingHandlerMapping.getPatternParser()); + + for (String path : paths.split(",")) { + path = path.trim(); + if (path.isEmpty()) { + continue; + } + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(path) + .options(options) + .build(); + requestMappingHandlerMapping.registerMapping(mappingInfo, djErpApiAdapterController, callApi); + logger.warn("DJErpAdapterMappingRegistrar] 등록 완료: " + path); + } + + registered = true; + + } catch (NoSuchMethodException e) { + logger.error("DJErpAdapterMappingRegistrar] callApi 메서드를 찾을 수 없습니다.", e); + } + } +} diff --git a/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java index d575301..7bc09a2 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/DJErpApiAdapterController.java @@ -16,7 +16,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.AntPathMatcher; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.eactive.eai.adapter.AdapterGroupVO; @@ -57,7 +56,6 @@ public class DJErpApiAdapterController implements HttpAdapterServiceKey { * @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer * endpoints) */ - @RequestMapping(value = { "/dj/{path:^(?!oauth).*$}", "/dj/{path:^(?!oauth).*$}/**" }) public ResponseEntity callApi(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception { // /ONLWeb/api/v1/public/getUserInfo.svc diff --git a/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java index 2fde9ef..8c2b4b6 100644 --- a/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/DJErpApiAdapterService.java @@ -1,5 +1,40 @@ package com.eactive.eai.adapter.service; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.StopWatch; +import org.apache.mina.common.ByteBuffer; +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; +import org.json.simple.parser.JSONParser; +import org.springframework.context.annotation.Primary; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.security.oauth2.provider.ClientDetails; +import org.springframework.stereotype.Service; +import org.springframework.util.AntPathMatcher; + import com.eactive.eai.adapter.AdapterGroupVO; import com.eactive.eai.adapter.AdapterPropManager; import com.eactive.eai.adapter.AdapterVO; @@ -8,6 +43,9 @@ import com.eactive.eai.adapter.http.HttpMemoryLogger; import com.eactive.eai.adapter.http.HttpMethodType; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthFilter; +//for encrypt/decrypt jwhong +import com.eactive.eai.authserver.service.OAuth2Manager; +import com.eactive.eai.common.context.ElinkTransactionContext; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.util.CommonLib; @@ -19,41 +57,12 @@ import com.eactive.eai.message.StandardMessageUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.StopWatch; -import org.apache.mina.common.ByteBuffer; -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; -import org.json.simple.parser.JSONParser; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.util.AntPathMatcher; - -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.net.URLDecoder; -import java.util.*; - -//for encrypt/decrypt jwhong -import com.eactive.eai.authserver.service.OAuth2Manager; import com.kjbank.encrypt.exchange.crypto.AES256Cipher; -import com.kjbank.encrypt.exchange.crypto.AESCipher; import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher; -import java.nio.charset.StandardCharsets; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import org.springframework.security.oauth2.provider.ClientDetails; +import com.kjbank.encrypt.exchange.crypto.AESCipher; import com.nimbusds.jwt.SignedJWT; -import com.eactive.eai.common.context.ElinkTransactionContext; - +@Primary @Service public class DJErpApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER);