HandlerMethodArgumentResolver

원종운·2019년 12월 26일
1

1.HandlerMethodArgumentResolver

  • 컨트롤러 메서드에서 특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩해주는 인터페이스
    + Controller에서 @RequestBody 어노테이션을 사용해 Request의 Body 값을 받아올 때
    + Controller에서 @PathVariable 어노테이션을 사용해 Request의 Path Parameter 값을 받아올 때

2.HandlerMethodArgument 사용

2-1) 어노테이션 작성

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}

2-2) 객체 작성

public class SessionUser implements Serializable {
    private String name;
    private String email;
    private String picture;

    ...
}

2-3) resolver 작성

  • HandlerMethodArgumentResolver를 상속받은 CustomHandlerMethodArgumentResolver을 작성해줍니다.

  • HandlerMethodArgumentResolver를 상속받은 객체는 아래 두개의 메소드를 구현해야 합니다.

boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory);     

public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
    private final HttpSession httpSession;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
        boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());

        return isLoginUserAnnotation && isUserClass;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        return httpSession.getAttribute("user");
    }
}
  • supportsParameter 메서드는 현재 파라미터를 resolver이 지원하는지에 대한 boolean을 리턴합니다.
  • resolveArgument 메서드는 실제로 바인딩을 할 객체를 리턴합니다.

2-4) resolver 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private CustomHandlerMethodArgumentResolver customHandlerMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(customHandlerMethodArgumentResolver);
    }
}

2-5) Controller에서 Binding

public String index(Model model, @LoginUser SessionUser user);
profile
Java, Python, JavaScript Lover

0개의 댓글