10

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アノテーションを持つクラスで)リゾルバーが実行されません

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

CurrentUserArgumentResolver クラスのいずれかのメソッドにブレークポイントを配置すると、どちらも機能しません。何が欠けているのかわからないのですか?

4

3 に答える 3

3

OK 上記の例では、Spring がすでにプリンシパル オブジェクトを解決していたため、引数リゾルバーが機能していないことがわかりました。

だから私は私の例を変えました

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

User モデル クラスを使用するには

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

そして今それは動作します!

于 2013-06-29T13:05:45.207 に答える
0

次のように、プロパティを使用してcustomArgumentResolversBean をロードします。

<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 />
于 2016-08-22T06:55:58.237 に答える