Spring HandlerMethodArgumentResolver 未执行 [英] Spring HandlerMethodArgumentResolver not executing
问题描述
我使用的是 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屋!