Sto usando Spring MVC 3.2.2Primavera HandlerMethodArgumentResolver non esecuzione
Ho definito una classe HandlerMethodArgumentResolver personalizzato come questo
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;
}
}
E aggiunto il seguente alla mia app-servlet.xml
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="my.package.CurrentUserArgumentResolver" lazy-init="false"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
e creato un'annotazione per CurrentUser
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
Quando avvio l'applicazione, la classe è costruita in quanto posso vedere il messaggio di registro "Pronto" ma il resolver non viene eseguito quando annoto un metodo controller in quanto tale (in una classe che ha annotazione @Controller)
@RequestMapping(method = RequestMethod.POST, value = "/update")
public ModelAndView update(@RequestParam MultipartFile background, @CurrentUser Principal principal) {
...
}
Se inserisco punti di interruzione su uno dei due metodi nella classe CurrentUserArgumentResolver, nessuno dei due funziona. Quindi non sono sicuro di ciò che mi manca?
apparire esattamente come la mia risposta a questa domanda: http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8769670#8769670 - Non riesco a vedere alcun errore nel codice postato. Quindi forse il problema è da qualche altra parte: controlla che tutto sia conforme e sia distribuito correttamente. Verifica che ci sia solo un MVC: anotationdriven. Verificare che il raggio del controller venga rilevato solo dalla scansione del componente dall'app-servlet.xml – Ralph
Sì, il mio codice era basato su una combinazione di risposta e documenti Spring. Tutto il codice viene compilato e il metodo del controller è chiamato correttamente, è solo che il principale è nullo. Mi aspetto almeno che venga chiamato il punto di interruzione su "supportsParameter". –
Qual è il valore del parametro del metodo controller (principal)? È nulla? – Ralph