From bd577ec6991318653407061ee436738a24635ab2 Mon Sep 17 00:00:00 2001 From: Terry Chang Date: Thu, 13 Sep 2018 14:52:52 +0900 Subject: [PATCH] =?UTF-8?q?XplatformArgumentResolver=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20@RequestDataSetList=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/XplatformArgumentResolver.java | 63 ++++++++++--------- .../terry/xplatform/web/SampleController.java | 14 +++-- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/terry/xplatform/config/xplatform/support/XplatformArgumentResolver.java b/src/main/java/com/terry/xplatform/config/xplatform/support/XplatformArgumentResolver.java index ae7ae07..b1f7813 100644 --- a/src/main/java/com/terry/xplatform/config/xplatform/support/XplatformArgumentResolver.java +++ b/src/main/java/com/terry/xplatform/config/xplatform/support/XplatformArgumentResolver.java @@ -40,22 +40,22 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class XplatformArgumentResolver implements HandlerMethodArgumentResolver { - + /** * DataSetList 객체를 HttpServletRequest의 setAttribute 메소드를 이용해서 저장할 때 사용되는 이름 */ private final String DATASETLIST_NAME; - + /** * VariableList 객체를 HttpServletRequest의 setAttribute 메소드를 이용해서 저장할 때 사용되는 이름 */ private final String VARIABLELIST_NAME; - + public XplatformArgumentResolver() { this.DATASETLIST_NAME = "dataSetList"; this.VARIABLELIST_NAME = "variableList"; } - + public XplatformArgumentResolver(String dataSetListName, String variableListName) { this.DATASETLIST_NAME = dataSetListName; this.VARIABLELIST_NAME = variableListName; @@ -65,29 +65,30 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver public boolean supportsParameter(MethodParameter parameter) { // TODO Auto-generated method stub boolean result = false; - - if(parameter.hasParameterAnnotation(RequestDataSet.class)){ + if(parameter.hasParameterAnnotation(RequestDataSetList.class)){ + result = true; + }else if(parameter.hasParameterAnnotation(RequestDataSet.class)){ result = true; }else if(parameter.hasParameterAnnotation(RequestVariable.class)){ result = true; } - + return result; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { // TODO Auto-generated method stub - + Class type = parameter.getParameterType(); Annotation[] annotations = parameter.getParameterAnnotations(); HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(); // HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); // PlatformRequest platformRequest = new HttpPlatformRequest(request, "utf-8"); - + DataSetList dataSetList = null; VariableList variableList = null; - + // 관련 처리를 할때마다 매번 Request의 Body에 있는 DataSetList와 VariableList를 만들면 오버헤드 소지가 있어서 // 처음에 한번만 읽고 DataSetList와 VariableList를 HttpServletRequest에 setAttribute를 통해 저장을 한 뒤에 // 다시 읽을때는 Request의 Body를 읽는게 아니라 저장되어 있는 것을 다시 읽어서 재활용한다 @@ -97,20 +98,20 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver PlatformData platformData = platformRequest.getData(); dataSetList = platformData.getDataSetList(); variableList = platformData.getVariableList(); - + request.setAttribute(DATASETLIST_NAME, dataSetList); request.setAttribute(VARIABLELIST_NAME, variableList); } else { dataSetList = (DataSetList)request.getAttribute(DATASETLIST_NAME); variableList = (VariableList)request.getAttribute(VARIABLELIST_NAME); } - + Object result = null; - - + + for(Annotation annotation : annotations){ Class annotationClass = annotation.annotationType(); - + if(annotationClass.equals(RequestDataSetList.class)){ // @RequestDataSetList 어노테이션에 대한 처리(이 어노테이션은 DataSetList 클래스객체만 파라미터 타입으로 받을 수 있다) if(type.equals(DataSetList.class)) { result = dataSetList; @@ -123,14 +124,14 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver if(!StringUtils.hasText(dataSetName)) { // DataSet 이름이 빠진것이므로 이거는 예외처리 진행하자 result = WebArgumentResolver.UNRESOLVED; } else { - DataSet dataSet = dataSetList.get(dataSetName); + DataSet dataSet = dataSetList.get(dataSetName); if(type.equals(DataSet.class)) { // DataSet 파라미터 타입으로 받을 경우는 해당 이름으로 DataSet을 찾아서 이를 return 해주면 된다 result = dataSet; } else { // DataSet 클래스 객체는 Collection 인터페이스 계열 클래스들만 변환이 가능하기 때문에 이에 대한 체크 if(Collection.class.isAssignableFrom(type)) { - // Type[] typeArray = ((ParameterizedType)parameter.getGenericParameterType()).getActualTypeArguments(); + // Type[] typeArray = ((ParameterizedType)parameter.getGenericParameterType()).getActualTypeArguments(); // Class genericClassType = (Class) ((ParameterizedType)parameter.getGenericParameterType()).getActualTypeArguments()[0]; - + Type genericType = ((ParameterizedType)parameter.getGenericParameterType()).getActualTypeArguments()[0]; Class genericClass = null; if(genericType instanceof Class) { @@ -146,7 +147,7 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver } } } - + // XplatformReflectionUtils.convertDataSetToCollection 메소드로 변환할 수 없는 타입일 경우 null이 return 되기 때문에 이에 대한 처리 if(result == null) { result = WebArgumentResolver.UNRESOLVED; @@ -181,7 +182,7 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver } } else { // 특정 변수 이름이 없으면 VO로 매핑하는 것이기 때문에 오히려 이런 경우 자바의 데이터타입과는 매핑을 할 수 없다 List keyList = variableList.keyList(); - + if(Collection.class.isAssignableFrom(type)) { Collection collectionResult = null; if(type.isInterface()) { @@ -193,11 +194,11 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver } else { collectionResult = (Collection)type.newInstance(); } - + for(String key : keyList) { collectionResult.add(variableList.getObject(key)); } - + result = collectionResult; } else if(Map.class.isAssignableFrom(type)) { Map mapResult = null; @@ -206,24 +207,24 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver } else { mapResult = (Map)type.newInstance(); } - + for(String key : keyList) { mapResult.put(key, variableList.getObject(key)); } - + result = mapResult; } else { // 객체로 변환하는 과정에서 예외가 발생하면 지원하지 않는 타입이기 때문에 그에 대한 처리를 한다 try { - + Object obj = type.newInstance(); - + for(String key : keyList) { Field keyField = ReflectionUtils.findField(type, key); ReflectionUtils.makeAccessible(keyField); - + Class keyFieldType = keyField.getType(); - + if(keyFieldType == int.class) { keyField.setInt(obj, variableList.getInt(key)); } else if(keyFieldType == Integer.class) { @@ -248,7 +249,7 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver keyField.set(obj, variableList.getObject(key)); } } - + result = obj; } catch(Exception e) { result = WebArgumentResolver.UNRESOLVED; @@ -256,9 +257,9 @@ public class XplatformArgumentResolver implements HandlerMethodArgumentResolver } } } - + } - + return result; } } diff --git a/src/main/java/com/terry/xplatform/web/SampleController.java b/src/main/java/com/terry/xplatform/web/SampleController.java index ea5d3d7..d543bf9 100644 --- a/src/main/java/com/terry/xplatform/web/SampleController.java +++ b/src/main/java/com/terry/xplatform/web/SampleController.java @@ -13,19 +13,21 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.terry.xplatform.config.xplatform.annotation.RequestDataSet; +import com.terry.xplatform.config.xplatform.annotation.RequestDataSetList; import com.terry.xplatform.config.xplatform.annotation.RequestVariable; import com.terry.xplatform.service.SampleService; import com.terry.xplatform.vo.SampleVO; +import com.tobesoft.xplatform.data.DataSetList; import lombok.extern.slf4j.Slf4j; @Controller @Slf4j public class SampleController { - + @Autowired SampleService sampleService; - + @RequestMapping("/egovSampleSelect") public void list(Model model , SampleVO sampleVO @@ -38,7 +40,7 @@ public class SampleController { List sampleList = sampleService.list(sampleVO); model.addAttribute("ds_output", sampleList); } - + /* @RequestMapping("/egovSampleSelect") public void list(HttpServletRequest httpServletRequest) { @@ -46,11 +48,13 @@ public class SampleController { String recordCountPerPage = httpServletRequest.getParameter("recordCountPerPage"); } */ - + @RequestMapping("/egovSampleModify") public void modify(@RequestDataSet(name="ds_input")ArrayList dataSet , @RequestDataSet(name="ds_input")List> dataSetMap - , @RequestDataSet(name="ds_input")Set dataHashSet) { + , @RequestDataSet(name="ds_input")Set dataHashSet + , @RequestDataSetList DataSetList dataSetList) { + logger.info("modify"); sampleService.modify(dataSet); }