복붙노트

[SPRING] Spring HandlerMethodArgumentResolver가 실행되지 않습니다.

SPRING

Spring HandlerMethodArgumentResolver가 실행되지 않습니다.

Spring MVC 3.2.2를 사용하고있다.

이처럼 사용자 정의 HandlerMethodArgumentResolver 클래스를 정의했습니다.

public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {

  public CurrentUserArgumentResolver() {
    System.out.println("Ready");
  }

  @Override
  public boolean supportsParameter(MethodParameter parameter) {
    return parameter.hasParameterAnnotation(CurrentUser.class);
  }

  @Override
  public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

      Principal principal = webRequest.getUserPrincipal();
      System.out.println("*** Principal ***: " + principal);
      return principal;
  }
}

그리고 다음을 app-servlet.xml에 추가했습니다.

<mvc:annotation-driven>
  <mvc:argument-resolvers>
    <beans:bean class="my.package.CurrentUserArgumentResolver" lazy-init="false"/>
  </mvc:argument-resolvers>
</mvc:annotation-driven>

CurrentUser에 대한 주석을 만들었습니다.

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

}

응용 프로그램을 시작할 때 로그 메시지 "Ready"가 표시 될 수 있지만 클래스 메서드 (@Controller annotation이있는 클래스)에 주석을 달면 해결자가 실행되지 않으므로 클래스가 생성됩니다.

@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
 ...
}

CurrentUserArgumentResolver 클래스의 두 메서드 중 하나에 중단 점을 넣으면 둘 다 작동하지 않습니다. 그래서 내가 무엇을 놓치고 있는지 확실하지 않습니까?

해결법

  1. ==============================

    1.스프링으로 추가 된 기본 핸들러에 대해 맞춤 핸들러의 우선 순위를 지정하려는 경우 @Configuration 파일에서이를 수행하는 스 니펫이 있습니다.

    스프링으로 추가 된 기본 핸들러에 대해 맞춤 핸들러의 우선 순위를 지정하려는 경우 @Configuration 파일에서이를 수행하는 스 니펫이 있습니다.

    private @Inject RequestMappingHandlerAdapter adapter;
    
    @PostConstruct
    public void prioritizeCustomArgumentMethodHandlers () {
      List<HandlerMethodArgumentResolver> argumentResolvers = 
          new ArrayList<> (adapter.getArgumentResolvers ());
      List<HandlerMethodArgumentResolver> customResolvers = 
          adapter.getCustomArgumentResolvers ();
      argumentResolvers.removeAll (customResolvers);
      argumentResolvers.addAll (0, customResolvers);
      adapter.setArgumentResolvers (argumentResolvers);
    }
    
  2. ==============================

    2.좋습니다. Spring이 이미 위의 예제에서 Principal 객체를 해결하고 있으므로 내 인수 확인자가 시작되지 않았습니다. 나는 게으르며 @CurrentUser 주석을 기존 매개 변수에 추가했습니다.

    좋습니다. Spring이 이미 위의 예제에서 Principal 객체를 해결하고 있으므로 내 인수 확인자가 시작되지 않았습니다. 나는 게으르며 @CurrentUser 주석을 기존 매개 변수에 추가했습니다.

    그래서 나는 나의 예를 바꿨다.

    @RequestMapping(method = RequestMethod.POST, value = "/update")
    public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
      ...
    }
    

    내 사용자 모델 클래스 사용

    @RequestMapping(method = RequestMethod.POST, value = "/update")
    public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser User user) {
      ...
    }
    

    그리고 지금 그것은 작동합니다!

  3. ==============================

    3.customArgumentResolvers 속성을 사용하여 다음과 같이 bean을로드합니다.

    customArgumentResolvers 속성을 사용하여 다음과 같이 bean을로드합니다.

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                        <property name="supportedMediaTypes">
                            <list>
                                <value>text/html;charset=UTF-8</value>
                                <value>text/plain;charset=UTF-8</value>
                                <value>application/json;charset=UTF-8</value>
                            </list>
                        </property>
                    </bean>
                </list>
            </property>
             <property name="customArgumentResolvers">
             <list>
                 <bean id="MyTestMethodArgumentResolver" class="com.gst.authorization.resolvers.MyTestMethodArgumentResolver"></bean>           
                 <bean id="currentUserMethodArgumentResolver" class="com.gst.authorization.resolvers.CurrentUserMethodArgumentResolver">
                                <property name="userModelClass" value="com.gst.model.appuser.AppUser" />
                        <property name="userModelRepository" ref="userRepository" />
                    </bean>
             </list>         
             </property>
        </bean> 
        <mvc:annotation-driven />
    
  4. from https://stackoverflow.com/questions/17331448/spring-handlermethodargumentresolver-not-executing by cc-by-sa and MIT license