Spring HandlerMethodArgumentResolver 未执行 [英] Spring HandlerMethodArgumentResolver not executing

查看:53
本文介绍了Spring HandlerMethodArgumentResolver 未执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是 Spring MVC 3.2.2

I am using Spring MVC 3.2.2

我已经定义了一个像这样的自定义 HandlerMethodArgumentResolver 类

I have defined a custom HandlerMethodArgumentResolver class like this

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

And added the following to my 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 创建了一个注解

and created an annotation for CurrentUser

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

}

当我启动应用程序时,类被构建,因为我可以看到日志消息就绪",但是当我这样注释控制器方法时解析器不执行(在具有@Controller 注释的类中)

When I start the application up the class is constructed as I can see the log message "Ready" but the resolver does not execute when I annotate a controller method as such (in a class that has @Controller annotation)

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

如果我在 CurrentUserArgumentResolver 类中的任一方法上放置断点,都不起作用.所以不确定我错过了什么?

If I put breakpoints on either method in the CurrentUserArgumentResolver class, neither work. So not sure what I am missing?

推荐答案

好的,我发现 Spring 已经在我上面的例子中解析了 Principal 对象,所以我的参数解析器没有启动.我一直懒惰并添加了现有参数的@CurrentUser 注释.

OK I worked out that Spring was already resolving the Principal object in my above example and so my argument resolver was not kicking in. I had been lazy and added the @CurrentUser annotation to an existing parameter.

所以我改变了我的例子

@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) {
  ...
}

现在它起作用了!

这篇关于Spring HandlerMethodArgumentResolver 未执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆