spring 3.1.1 에서 CommandMapArgumentResolver 작동하지 않습니다.
- 작성자 :
- 권*성
- 작성일 :
- 2013-07-31 12:55:29
- 조회수 :
- 1,068
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
spring 3.1.1 버전을 사용하는 프로젝트에서 전자정부의 CommandMapArgumentResolver를 사용하려고 합니다. 올바른 parameter값이 설정되지 않습니다.
디버깅한 원인은 spring 3.1 이상에서는 기본으로 등록하는 ArgumentResolver가 그 이전 버전과 틀린것 같습니다. 스프링이 등록하는 MapMethodProcessor 가 먼저 Map 타입을 처리하기 때문에 인것 같습니다.
CommandMapArgumentResolver 는 유용한 기능이라서 spring 3.1이상에서도 사용가능했으면 좋겠습니다.
좋은 해결책이 있으면 알려주셨으면 합니다.
참고로 spring 빈 설정은 mvc tag를 상용하며
=======================================================================
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<bean class="kr.co.vacu.cmm.CommandMapArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
=======================================================================
스프링 메뉴얼에는 Spring 3.1에서도 기존 WebArgumentResolver를 HandlerMethodArgumentResovler를 구현하는 SevletWebArgumentResolverAdapter로 감싸서 호환성을 유지 한다고 되어 있지만 혹시나해서 HandlerMethodArgumentResolver 구현체로 만들어서 CommandMapArgumentResolver 변경하여 등록 하여도 똑같더군요. (전자정부의 egovframework.rte.ptl.mvc.bind.CommandMapArgumentResolver 등록해도 똑같은 현상 발생합니다.)
실제적용하는 소스 코드는
@RequestMapping(value = "/write", method = RequestMethod.POST)
public String Write(Model model,
@Valid @ModelAttribute("crudVO") CrudVO crudVO,
BindingResult result,
Map<String, Object> commandMap) {
System.out.println("commandMap : "+ commandMap);
// 출력내용 : {crudVO=kr.co.vacu.model.CrudVO@f1cbd7[seq=3,title=abasdfsdfsdf,desc=11,year=16,birthDate=Wed Jul 31 00:00:00 KST 2013], org.springframework.validation.BindingResult.crudVO=org.springframework.validation.BeanPropertyBindingResult: 0 errors}
==============================================================================
참고로 변경한 HandlerMethodArgumentResolver 구현체 변경 CommandMapArgumentResolver 를 첨부 합니다/
전자정부 spring 3.0.5 버전에서만 사용가능하고 그 이상버전에서는 문제가 발생할 수 있는지 알려주세요
디버깅한 원인은 spring 3.1 이상에서는 기본으로 등록하는 ArgumentResolver가 그 이전 버전과 틀린것 같습니다. 스프링이 등록하는 MapMethodProcessor 가 먼저 Map 타입을 처리하기 때문에 인것 같습니다.
CommandMapArgumentResolver 는 유용한 기능이라서 spring 3.1이상에서도 사용가능했으면 좋겠습니다.
좋은 해결책이 있으면 알려주셨으면 합니다.
참고로 spring 빈 설정은 mvc tag를 상용하며
=======================================================================
<mvc:annotation-driven conversion-service="conversionService">
<mvc:argument-resolvers>
<bean class="kr.co.vacu.cmm.CommandMapArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
=======================================================================
스프링 메뉴얼에는 Spring 3.1에서도 기존 WebArgumentResolver를 HandlerMethodArgumentResovler를 구현하는 SevletWebArgumentResolverAdapter로 감싸서 호환성을 유지 한다고 되어 있지만 혹시나해서 HandlerMethodArgumentResolver 구현체로 만들어서 CommandMapArgumentResolver 변경하여 등록 하여도 똑같더군요. (전자정부의 egovframework.rte.ptl.mvc.bind.CommandMapArgumentResolver 등록해도 똑같은 현상 발생합니다.)
실제적용하는 소스 코드는
@RequestMapping(value = "/write", method = RequestMethod.POST)
public String Write(Model model,
@Valid @ModelAttribute("crudVO") CrudVO crudVO,
BindingResult result,
Map<String, Object> commandMap) {
System.out.println("commandMap : "+ commandMap);
// 출력내용 : {crudVO=kr.co.vacu.model.CrudVO@f1cbd7[seq=3,title=abasdfsdfsdf,desc=11,year=16,birthDate=Wed Jul 31 00:00:00 KST 2013], org.springframework.validation.BindingResult.crudVO=org.springframework.validation.BeanPropertyBindingResult: 0 errors}
==============================================================================
참고로 변경한 HandlerMethodArgumentResolver 구현체 변경 CommandMapArgumentResolver 를 첨부 합니다/
전자정부 spring 3.0.5 버전에서만 사용가능하고 그 이상버전에서는 문제가 발생할 수 있는지 알려주세요
A
안녕하세요. 권영성님.
현재 제공되고 있는 CommandMapArgumentResolver는 Spring의 WebArgumentResolver를 사용하고 있으며, Spring 3.1.X에서도 동일하게 사용하실 수 있습니다. (표준프레임워크 2.6의 경우는 Spring 3.0.5를 기준으로 제공됨)
CommandMapArgumentResolver가 정상 동작하지 않는 이유는 WebArgumentResolver 문제가 아니라 다른 문제인 것 같습니다. (참고로 CommandMapArgumentResolver는 <mvc:annotation-driven>를 통해 지정하실 수 없습니다.)
HandlerMethodArgumentResolver로 변경하신 후에도 정상동작하지 않는 이유는 변경하신 부분 상의 문제가 아닌 위의 원인으로 인한 것으로 추측됩니다.
그럼, 즐거운 하루되십시오.
감사합니다.
현재 제공되고 있는 CommandMapArgumentResolver는 Spring의 WebArgumentResolver를 사용하고 있으며, Spring 3.1.X에서도 동일하게 사용하실 수 있습니다. (표준프레임워크 2.6의 경우는 Spring 3.0.5를 기준으로 제공됨)
CommandMapArgumentResolver가 정상 동작하지 않는 이유는 WebArgumentResolver 문제가 아니라 다른 문제인 것 같습니다. (참고로 CommandMapArgumentResolver는 <mvc:annotation-driven>를 통해 지정하실 수 없습니다.)
HandlerMethodArgumentResolver로 변경하신 후에도 정상동작하지 않는 이유는 변경하신 부분 상의 문제가 아닌 위의 원인으로 인한 것으로 추측됩니다.
그럼, 즐거운 하루되십시오.
감사합니다.