2012-08-12 8 views
5

Chcę mieć możliwość zdefiniowania klasy kontrolera nadrzędnego, która będzie miała mapowanie "/ api", a następnie rozszerzyć ten kontroler przy pomocy różnych implementacji. Więc ApiController będą miały:Udostępnianie wspólnej ścieżki nadrzędnej podczas implementowania kontrolerów sprężyn

@Controller 
@RequestMapping("/api") 

Na przykład, mój kontroler Użytkownik powinien przedłużyć kontroler baza API i również dodać „/ Users” do ścieżki, więc będzie to odpowiedź na „/ API/użytkowników” żądań. Tak więc UserController będzie miał:

@Controller 
@RequestMapping("/users") 

, ale ponieważ rozszerza ApiController, będzie skutecznie odpowiadać/api/użytkowników.

Naturalnie mogę dodać "/ api" do wszystkich kontrolerów, aby osiągnąć to bez klasy rodzica, ale wolę zrobić to "właściwą drogą", jeśli to możliwe, aby móc zdefiniować moje implementacje api za pomocą czystsza i bardziej widoczna ścieżka.

Próbowałem rozszerzenie klasy bazowej ApiController, ale to nie działa, UserController jeszcze odpowiedzi na „/ użytkowników” i ignoruje klasy bazowej „/ API”.

Odpowiedz

3

Hmmm. Można spróbować, to jest to, co działa dla mnie:

@RequestMapping("/abstract") 
public abstract class AbstractController { 


} 

@Controller 
public class ExtendedAbstractController extends AbstractController { 

    @RequestMapping("/another") 
    public String anotherTest() { 
     return "another"; 
    } 

} 

Uwaga, klasa bazowa musi mieć żadnego @Controller adnotacji i musi być streszczenie.

Jeśli próbujesz wykonać rozszerzenie nie klasy abstrakcyjnej opisanej jako kontroler i która ma @RequestMapping s, otrzymasz błędy na etapie inicjowania RequestMappingHandlerMapping.

+1

Cześć, przepraszam, jakoś zapomniałem o twojej odpowiedzi. Niestety, nie zrobię tego, czego potrzebuję, ponieważ chcę, aby klasy implementujące również miały swoje własne mapowanie "base", więc ExtendedAbstractController powinien mieć adnotację @RequestMapping ("/ another"), aby WSZYSTKIE jej metody miały ten prefiks. W Twoim rozwiązaniu tylko metody z adnotacjami typu RequestMapping będą miały rozszerzoną adnotację. – TheZuck

+1

@ TheZuck tak, widzę i wiem, że nie jest to, czego potrzebujesz. : [Po prostu starałem się pomóc tobie :) W tej chwili Spring nie obsługuje dziedziczenia adnotacji, jak chcesz ... Btw możesz iść do wiosny JIRA i głosować na to samo lub stworzyć nowy problem ze swoimi sugestiami. ;) – masted

0

Można to osiągnąć z:

  1. utworzyć konfigurację sub-kontekstowe dla kontrolerów z prefiksem samej ścieżce
  2. utworzyć sub-context z własnym DispatcherServlet odwzorowane na pewnej ścieżce

spojrzeć na this answer . To podobny problem, ale dla @RestControllers.

Powiązane problemy