Używam MVC wiosny 3.2.2Wiosna HandlerMethodArgumentResolver nie wykonując
mam zdefiniowaną klasę zwyczaj HandlerMethodArgumentResolver jak ten
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;
}
}
i dodaje następujące do mojego app-servlet.xml
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="my.package.CurrentUserArgumentResolver" lazy-init="false"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
i utworzyli adnotację dla CurrentUser
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
Po uruchomieniu aplikacji klasa jest konstruowana tak, jak widzę komunikat dziennika "Gotowy", ale resolver nie jest wykonywany, gdy przypisuję metodę kontrolera jako taką (w klasie, która ma adnotację @Controller)
@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
...
}
Jeśli umieściłem punkty przerwania na obu metodach w klasie CurrentUserArgumentResolver, żadna z nich nie działa. Więc nie jestem pewien, czego mi brakuje?
wyglądać dokładnie jak moja odpowiedź na to pytanie: http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8769670#8769670 - Nie widzę żadnego błędu w opublikowanym kodzie. Więc może problem jest gdzieś indziej: sprawdź, czy wszystko jest w porządku i jest poprawnie wdrożone. Sprawdź, czy istnieje tylko jeden MVC: anotationdriven. Sprawdź, czy wiązka kontrolera jest znaleziona tylko przez skanowanie komponentu z app-servlet.xml. – Ralph
Tak, mój kod był oparty na kombinacji twoich odpowiedzi i wiosennych dokumentów. Cały kod kompiluje się, a metoda kontrolera jest wywoływana poprawnie, po prostu jest ona zerowa. Przynajmniej spodziewałbym się, że punkt przerwania na "SupportParameter" zostanie wywołany. –
Jaka jest wartość parametru metody kontrolera (zleceniodawcy)? Czy jest pusty? – Ralph