헤르메스 LIFE

[String] Annotation기반 컨트롤러에 custom argument 적용하기 (WebArgumentResolver) 본문

Spring Framework

[String] Annotation기반 컨트롤러에 custom argument 적용하기 (WebArgumentResolver)

헤르메스의날개 2012. 3. 16. 20:36
728x90
Method의 Argument를 자동으로 정의할 수 있도록 만들어주는 Class입니다. 

원문 : http://ultteky.egloos.com/10525814 

WebArgumentResolver 재밌는 인터페이스 발견..

SPI for resolving custom arguments for a specific handler method parameter.
Typically implemented to detect sppecial parameter types, resolving well-known argument values for them.


뭐 대충 이런식.. 실행시 필요한 값들을 메소드에 박아두니
일일이 request.getParamter로 불러올 필요가 없어져서 좀 더 깔끔해졌다.

@RequestParam(value="/send/message/to/{receiver}", params="message")
@Secured("ROLE_USER")
public void sendMessage(UserDetails me, String receiver, String message) throws Exception {
    messagingService.sendMessage(me.getUsername(), receiver, message);
}

일반적으로 Annotation기반 Controller의 메소드에서 사용가능한 타입이 아닌
String 타입이나 UserDetails(Spring Security) 클래스가 사용되었다.
이걸 지원하기 위해 WebArgumentResolver 를 구현한 클래스를 작성하고..

public class RestfulArgumentResolver implements WebArgumentResolver {
    public Object resolveArgument(MethodParameter param, NativeWebRequest req) {
        Class<?> type = param.getParameterType();
        Method method = param.getMethod();

        if (type.equals(UserDetails.class)) {
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();

            if (auth != null && !auth.getName().equals("anonymous")) {
                return auth.getPrincipal();
            }
        }
        else if (type.equals(String.class)) {
            HttpServletRequest request = (HttpServletRequest) req.getNativeRequest();

            String name = param.getParameterName();
            Object value = request.getParameter(name);

            if (value != null) {
                return value;
            }
        }

        return UNRESOLVED;
    }
}

이렇게 등록하면 된다.

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolvers">
        <list>
            <bean class="kr.steelheart.support.web.RestfulWebArgumentResolver" />
        </list>
    </property>        
</bean>

참 쉽다;  
728x90