세션의 정보로 member 객체로 만드는 커스텀 ArgumentResolver
를 빈으로 등록해 컨트롤러에서 @Login Member member
를 사용할 수 있게끔 구현
ArgumentResolver들 중 어노테이션을 사용하는 HandlerMethodArgumentResolver
를 상속받아 구현해야한다.
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParameter 수행");
boolean hasParameterAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean assignableFrom = Member.class.isAssignableFrom(parameter.getParameterType());
return hasParameterAnnotation && assignableFrom;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
log.info("resolveArgument 실행");
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null) return null;
return session.getAttribute(SessionConst.LOGIN_MEMBER);
}
}
LoginMemberArgumentResolver
를 사용할 수 있다.NativeWebRequest
에서 HttpServletRequest
로 다운캐스팅 후 세션에서 멤버정보를 가져온다. public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginMemberArgumentResolver());
}