아래의 예는 간단한 로그인 후 홈화면으로 넘어갈때 회원정보 객체 Model을 Session에 담아 로그인 후처리 하는 부분을 ArgumentResolver @Login을 등록하여 객체를 반환하는 예제이다.
public String home(@SessionAttribute(name=SessionConst.LOGIN_MEMEBER, required = false) Member member)
public String homeArgumentResolver(@Login Member member)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParamter 실행");
// Custom annotation이 있는지 확인 (내가 등록한 Customer anntation : Login.class)
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
// Customer annotaion에 해당하는 파라미터가 Member 클래스와 같나?
boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
// 두개가 모두 만족하면 resolveArgument 실행
return hasMemberType && hasMemberType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
log.info("resolverArgument 실행");
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if(session==null) {
return null;
}
return session.getAttribute(SessionConst.LOGIN_MEMEBER);
}
}
resolvers.add(내가 등록한 ArgumentResolver 클래스);
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginMemberArgumentResolver());
}