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注释的类中),解析器不会执行。
@RequestMapping(method = RequestMethod.POST, value = "/update")public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
 ...
}
如果我在CurrentUserArgumentResolver类中的任何一个方法上都设置了断点,则两者均无效。所以不确定我缺少什么吗?
回答:
好的,我知道在上面的示例中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) {
  ...
}
现在就可以了!
以上是 Spring HandlerMethodArgumentResolver不执行 的全部内容, 来源链接: utcz.com/qa/430953.html


