2012-08-12 4 views
5

Ich möchte eine übergeordnete Controller-Klasse definieren können, die eine Zuordnung von "/ api" hat, und dann diesen Controller mit meinen verschiedenen Implementierungen erweitern. So wird ApiController haben:Gemeinsamer übergeordneter Pfad bei der Implementierung von Spring-Controllern

@Controller 
@RequestMapping("/api") 

Zum Beispiel meines User-Controller der Basis api Controller erweitern sollten und auch hinzufügen "/ Benutzer" auf den Weg, so wird es auf "/ api/users" Anfragen zu antworten. So UserController wird:

aber da es ApiController erweitert, wird es wirksam zu/API/Benutzer beantworten.

Natürlich kann ich "/ api" allen Controllern voranstellen, so dass dies ohne die Elternklasse erreicht wird, aber ich bevorzuge es "den richtigen Weg" wenn es möglich ist, so dass ich meine API Implementierungen mit a definieren kann sauberer und sichtbarer Pfad.

Ich habe versucht, die ApiController-Basisklasse zu erweitern, aber das funktioniert nicht, UserController antwortet immer noch auf "/ users" und ignoriert die Basisklasse "/ api".

Antwort

3

Hmmm. Sie können dies versuchen, es ist das, was für mich funktioniert:

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


} 

@Controller 
public class ExtendedAbstractController extends AbstractController { 

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

} 

Hinweis, Ihre Basisklasse keine @Controller Annotation haben muss und abstrakt sein muss.

Wenn Sie versuchen, zu erweitern, nicht abstrakte Klasse als Controller kommentiert und die @RequestMapping s hat, erhalten Sie Fehler in Schritt RequestMappingHandlerMapping initialisieren.

+1

Hallo, sorry, ich muss deine Antwort irgendwie verpasst haben. Leider wird dies nicht tun, was ich brauche, da ich möchte, dass die implementierenden Klassen auch ihr eigenes "Basis" -Mapping haben, also sollte ExtendedAbstractController eine @RequestMapping ("/ another") Annotation haben, so dass ALLE ihre Methoden dieses Präfix haben. In Ihrer Lösung haben nur Methoden mit einer RequestMapping-Annotation eine erweiterte Annotation. – TheZuck

+1

@TheZuck Ja, ich sehe und ich weiß, ist nicht das, was Sie brauchen. : [Gerade war versucht, Ihnen zu helfen. :) Im Moment unterstützt Spring nicht die Vererbung von Anmerkungen, wie Sie wollen ... Btw können Sie gehen, um die Frühling JIRA und stimmen Sie auf das gleiche oder erstellen Sie ein neues Problem mit Ihren Vorschlägen. ;) – masted

0

Sie können es mit erreichen:

  1. erstellen Unterkontextkonfiguration für Controller mit demselben Pfad Präfix
  2. erstellen Subkontext mit eigenen DispatcherServlet bestimmten Pfad zugeordnet

Blick auf this answer . Es ist ein ähnliches Problem, aber für @RestControllers.

Verwandte Themen