J'utilise spring 2.5 et des annotations pour configurer mon contexte web spring-mvc. Malheureusement, je suis incapable de faire fonctionner ce qui suit. Je ne suis pas sûr que ce soit un bug (semble-t-il) ou s'il y a un malentendu fondamental sur le fonctionnement des annotations et du sous-classement de l'implémentation de l'interface.Spring-MVC Problème lors de l'utilisation de @Controller sur un contrôleur implémentant une interface
Par exemple,
@Controller
@RequestMapping("url-mapping-here")
public class Foo {
@RequestMapping(method=RequestMethod.GET)
public void showForm() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String processForm() {
...
}
}
fonctionne très bien. Lorsque le contexte démarre, les URL que ce gestionnaire manipule sont découvertes et tout fonctionne bien.
Cela ne signifie toutefois pas:
@Controller
@RequestMapping("url-mapping-here")
public class Foo implements Bar {
@RequestMapping(method=RequestMethod.GET)
public void showForm() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String processForm() {
...
}
}
Lorsque je tente de tirer vers le haut l'url, je reçois la mauvaise trace de la pile suivante:
javax.servlet.ServletException: No adapter for handler [[email protected]]: Does your handler implement a supported interface like Controller?
org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1091)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:874)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
Cependant, si je change barre à un résumé superclasse et Foo l'étend, alors ça marche à nouveau.
@Controller
@RequestMapping("url-mapping-here")
public class Foo extends Bar {
@RequestMapping(method=RequestMethod.GET)
public void showForm() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String processForm() {
...
}
}
Cela semble être un bogue. L'annotation @Controller devrait être suffisante pour marquer cela comme un contrôleur, et je devrais être en mesure d'implémenter une ou plusieurs interfaces dans mon contrôleur sans avoir à faire quoi que ce soit d'autre. Des idées?
Needed de noter que CGLIB est plutôt obsolète. –