스프링 프레임워크 3.0.x에서 3.1.0으로 올라고니 몇가지 잘 동작하지 않는 부분이 있었다.

오늘은 그중 하나.


org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 에서

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 로 변한 부분을 알아보자.




컨트롤러에서 호출되는 파라미터에따라 빈 초기화등에

WebArgumentResolvers의 resolveArgument()를 오버라이딩해서 사용 할 수 있었다.


3.0까지는 AnnotationMethodHandlerAdapter 에 등록을 해 주었다.

하지만 3.1부터는 RequestMappingHandlerAdapter 로 바뀌었다.


사실 3.1에서도 아래와 같이 등록 가능하다.

<mvc:annotation-driven>

    <mvc:argument-resolvers>

        <bean class="com.millky.aop.MillkyArgumentResolver" />

    </mvc:argument-resolvers>

</mvc:annotation-driven>

하지만 여기 문제가 좀 있다.

참고 : https://jira.springsource.org/browse/SPR-8648

<mvc:annotation-driven />과 RequestMappingHandlerAdapter 이 같이 동작을 안한다;;



argument-resolvers만 사용하면 상관 없을 수도 있는데.


지금 교육(?) 하는 프로젝트가

messageConverters 와 webBindingInitializer 도 사용하는 부분이 있어서...


사실 messageConverters 도 지원된다.

참고로 아래는 : @ResponseBody로 나가는 문자열을 UTF-8로 변환하기

<mvc:message-converters register-defaults="false">

    <bean class="org.springframework.http.converter.StringHttpMessageConverter" >

        <property name="supportedMediaTypes">

            <value>text/plain;charset=UTF-8</value>

        </property>

    </bean>

</mvc:message-converters>


이렇게 되는데...

@Valid 어노테이션 사용 하기에서 막힌다;;


 


뭐 그래서 이제 해야 하는 것이 바로..

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

요것을


<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

요걸로 바꾸면 된다.



여기서 끝나면 좋겠지만.

customArgumentResolvers 부분이 변경되었다.


이전에 implements WebArgumentResolver를 구현했는데.

이제는 implements HandlerMethodArgumentResolver를 구현해야 한다.


이전 메서드도 파라미터가 바뀌고 새로운 메서드도 하나 추가되었다.


public boolean supportsParameter(MethodParameter methodParameter)


바로 요건데~

resolveArgument() 여기서 사용할 것에 대해서 true를 리턴 해주면 된다.


음 좀더 명확하게 처리하기위해 수정 한 것 같다.



앞으로도 조금 더 연구를 해 봐야 할 것 같다. 오늘은 여기까지~




아 글 수정하다 보니 무지무지 심각한 버그가 있네..

<  ...  > 이 괄호를 왜 못불러 오지? 이거 내일 당장 수정해야 할 듯 ㅠㅠ