HandlerMethodArgumentResolver
특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩해주는 인터페이스
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
supportsParameter
supportsParameter
는 컨트롤러의 메서드에 어노테이션이 포함되어 있는지 확인하는 역할을 한다.
만약 포함되어 있다면 아래 메서드인 resolveArgument
를 실행하고 포함되어 있지 않다면 실행하지 않는다.
resolveArgument
resolveArgument
메서드는 어노테이션이 포함되어 있을 때 처리하고 싶은 로직을 작성하면 이를 처리하고 결과값을 반환하는 메서드이다.
resolver를 만들면 끝이 아니다. resolver를 만든 후 스프링에게 알려주어야 한다.
WebMvcConfigurer
인터페이스를 implements하고 addArgumentResolvers를 구현하면 된다.
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final AuthArgumentResolver authArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(authArgumentResolver);
resolvers.add(ipAddressArgumentResolver);
}
}
Auth
어노테이션@Auth(permit = {...}) Long userId
@Hidden // Swagger 문서에 표시하지 않음
@Target(PARAMETER)
@Retention(RUNTIME)
public @interface Auth {
UserType[] permit() default {};
boolean anonymous() default false;
}