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