2018년 2월 2일 금요일

ServletRequestDataBinderUtil 만들기 - static method로 @ModelAttribute 처리하기

ValidationUtil 만들기 에서 언급된 케이스와 같이 확장된 컨트롤러에 대해 확장된 도메인을 획득하고 싶은 경우가 있다.

하지만 이미 상위 컨트롤러 메소드의 argument 는 고정되어 있는 객체이고 이를 확장한 도메인을 넘겨받는 처리를 하려면 generic을 사용할 수도 있다.

여기선 static method를 통해 획득할 수 있는 유틸을 만들어보았다.


/**
 * 요청받은 request 의 parameter를 기반으로 modelAttribute object를 호출하는 유틸.
 * @author bluesky
 *
 */
public class ServletRequestDataBinderUtil {

 public static  T getObject(String objectName, Class clazz) {
  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

  T instantiateClass = BeanUtils.instantiateClass(clazz);
  
  ServletRequestDataBinder servletRequestDataBinder = objectName == null ? new ServletRequestDataBinder(instantiateClass) : new ServletRequestDataBinder(instantiateClass, objectName);
  servletRequestDataBinder.bind(request);
  
  @SuppressWarnings("unchecked")
  T target = (T) servletRequestDataBinder.getTarget();
  
  return target;
 }

 public static  T getObject(Class clazz) {
  return getObject(null, clazz);
 }
}

위 유틸을 사용해 modelAttribute를 획득하는 방법은 다음과 같다.

TestObject testObjectd = ServletRequestDataBinderUtil.getObject(TestObject.class)


ValidationUtil과 연계하여 만들면 아래와 같다.
/**
 * 요청받은 request 의 parameter를 기반으로 modelAttribute object를 호출하는 유틸.
 * @author bluesky
 *
 */
public class ServletRequestDataBinderUtil {

 public static  T getObject(String objectName, Class clazz, Object... validationHints) {
  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

  T instantiateClass = BeanUtils.instantiateClass(clazz);
  
  ServletRequestDataBinder servletRequestDataBinder = objectName == null ? new ServletRequestDataBinder(instantiateClass) : new ServletRequestDataBinder(instantiateClass, objectName);
  servletRequestDataBinder.bind(request);
  
  @SuppressWarnings("unchecked")
  T target = (T) servletRequestDataBinder.getTarget();
  
  if (validationHints != null) {
   ValidationUtil.validate(target, validationHints);
  }
  
  return target;
 }

 public static  T getObject(Class clazz) {
  return getObject(null, clazz, (Object[]) null);
 }
 
 public static  T getObject(String objectName, Class clazz) {
  return getObject(objectName, clazz, (Object[]) null);
 }
 
 public static  T getObject(Class clazz, Object... validationHints) {
  return getObject(null, clazz, validationHints);
 }
}



validation 체크까지 하면 다음과 같다.
TestObject testObjectd = ServletRequestDataBinderUtil.getObject(TestObject.class, TestObjectValidate.class)

댓글 없음:

댓글 쓰기