하지만 이미 상위 컨트롤러 메소드의 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)
댓글 없음:
댓글 쓰기