인프런 커뮤니티 질문&답변

toby0806님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

ArgumentResolver 활용

PathVariable 앞에 커스텀 애노테이션을 붙이면 동작이 안 됩니다.

작성

·

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());
    }
}

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. toby0806님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

toby0806님의 프로필 이미지

작성한 질문수

질문하기