작성
·
168
·
수정됨
0
안녕하세요!
@PathVariable 앞에 제가 만든 커스텀 애노테이션을 붙인 후 ArgumentResolver가 동작 되길 기대 했으나, supportsParameter나 resolveArgument에 어떠한 log가 찍히지 않는 것을 확인 했습니다.
그런데 이유는 모르겠지만 @ModelAttribute 앞에 커스텀 애노테이션을 붙였을 때에는 동작 하더라고요. 왜 PathVariable 앞에 커스텀 애노테이션을 붙였을 경우에는 동작이 안 되는 지 모르겠습니다.
구글링이나 GPT를 통해서도 열심히 찾아 봤으나 그 이유를 찾지 못했는데요. 문제점이 무엇인지 알려주시면 감사 드리겠습니다..!
// 커스텀 애노테이션
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Month {
}
// 컨트롤러
public Class 클래스 {
......
public 리턴타입 메서드(@Month @PathVariable Integer month) {}
}
// ArgumentResolver
@Slf4j
public class MonthArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("MonthArgumentResolver supportsParameter={}", parameter);
return parameter.hasParameterAnnotation(Month.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
HttpServletRequest httpServletRequest = (HttpServletRequest) webRequest.getNativeRequest();
log.info("MonthArgumentResolver resolveArgument={}", httpServletRequest);
return 1; // 임시로 1로 반한 함
}
}
// config
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new MonthArgumentResolver());
}
}