Używam wiosny 2.5 i adnotacji do konfiguracji mojego kontekstu webowego spring-mvc. Niestety, nie mogę wykonać poniższych czynności. Nie jestem pewien, czy jest to błąd (wygląda na to), czy też istnieje podstawowe nieporozumienie dotyczące działania podklasowania i implementacji podklas.Spring-MVC Problem przy użyciu @Controller na kontrolerze implementującym interfejs
Na przykład
@Controller
@RequestMapping("url-mapping-here")
public class Foo {
@RequestMapping(method=RequestMethod.GET)
public void showForm() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String processForm() {
...
}
}
działa dobrze. Po uruchomieniu kontekstu odkrywane są adresy URL obsługiwane przez ten program obsługi i wszystko działa świetnie.
To jednak nie:
@Controller
@RequestMapping("url-mapping-here")
public class Foo implements Bar {
@RequestMapping(method=RequestMethod.GET)
public void showForm() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String processForm() {
...
}
}
Kiedy próbuję podciągnąć url, otrzymuję następujący paskudny ślad stosu:
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)
Jednak jeśli zmienię Bar być abstrakcyjny nadklasy i Foo przedłużyć ją, a następnie działa ponownie.
@Controller
@RequestMapping("url-mapping-here")
public class Foo extends Bar {
@RequestMapping(method=RequestMethod.GET)
public void showForm() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String processForm() {
...
}
}
Wydaje się, że to błąd. Adnotacja @Controller powinna być wystarczająca, aby oznaczyć to jako kontroler, i powinienem być w stanie zaimplementować jeden lub więcej interfejsów w moim kontrolerze bez konieczności robienia czegokolwiek innego. Jakieś pomysły?
potrzebne, aby pamiętać, że CGLIB jest raczej przestarzałe. –