HandlerMethodArgumentResolver 란걸 사용할 일이 생겨서 내용을 정리하였다.
HandlerMethodArgumentResolver 스프링 3.1에서 추가된 인터페이스 이다.
스프링 사용시에 컨트롤러에 파라메터를 수정하거나 공통적으로 추가할 경우 사용한다.
HandlerMethodArgumentResolver는 사용자 요청이 Controller에 도달하기 전에 요청 파라메터를 수정할 수 있다.
| public interface HandlerMehtodArgumentResolver { boolean supportsParameter(MethodParameter parameter); Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception; }
| cs |
[HandlerMethodArgumentResolver]
HandlerMethodArgumentResolver 인터페이스는 다음 두 메서드를 제공한다.
- supportsParameter() : HandlerMethodArgumentResolver가 해당하는 파라미터를 지원할지 여부를 반환한다. true를 반환하면 resolveArgument 메서드가 수행된다.
- resolveArgument() :파라미터의 인자값에 대한 정보를 바탕으로 실제 객체를 생성하여 해당 파라미터 객체에 바인딩합니다.
HandlerMethodArgumentResolver 구현예시
1) HttpSession 정보를 @LoginUser 어노테이션을 이용해서 받기
| @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LoginUser { }
| cs |
[LoginUser 어노테이션을 생성한다. ]
| public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modleAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { Object user = webRequest.getAttribute(UserSessionUtils.USER_SESSION_KEY, WebRequest.SCOPE_SESSION); return user; } @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(LoginUser.class); } }
| cs |
[HandlerMethodArgumentResolver를 구현한다.]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class SpringBootWebApplication implements WebMvcConfigurer { @Autowired private LoginUserHandlerMethodArgumentResolver loginUserArgumentResolver; public static void main(String[] args) { SpringApplication.run(SpringBootWebApplication.class, args); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(loginUserArgumentResolver); } | cs |
WebMvcConfigurer를 implements 한다음 addArgumentResolvers() 메서드를 오버라이드하여 loginUserArgumentResolver를 추가시켜준다.
출처 : https://xmfpes.github.io/java/spring-resolver/
참고 :
https://to-dy.tistory.com/57?category=700248
https://to-dy.tistory.com/60