Ayu*_*lik 10 spring annotations spring-mvc
我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
并将以下内容添加到我的app-servlet.xml中
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="my.package.CurrentUserArgumentResolver" lazy-init="false"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
Run Code Online (Sandbox Code Playgroud)
并为CurrentUser创建了一个注释
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,构造了类,因为我可以看到日志消息"Ready",但是当我注释控制器方法时(在具有@Controller注释的类中),解析器不会执行
@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果我在CurrentUserArgumentResolver类中的任一方法上放置断点,则都不起作用.所以不确定我错过了什么?
Lev*_*sov 16
如果有人想要通过spring添加的默认处理程序优先考虑自定义处理程序,这里有一个为我做的代码片段,我在一个@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);
}
Run Code Online (Sandbox Code Playgroud)
好吧,我发现 Spring 已经解析了上面示例中的主体对象,因此我的参数解析器没有启动。我很懒,将 @CurrentUser 注释添加到现有参数中。
所以我改变了我的例子
@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
...
}
Run Code Online (Sandbox Code Playgroud)
使用我的用户模型类
@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser User user) {
...
}
Run Code Online (Sandbox Code Playgroud)
现在可以了!
归档时间: |
|
查看次数: |
12206 次 |
最近记录: |