2012-08-12 23 views
5

Quiero poder definir una clase controladora principal que tendrá una asignación de "/ api", y luego extender ese controlador con mis diferentes implementaciones. Así ApiController tendrá:Comparta una ruta padre común cuando implemente los controladores Spring

@Controller 
@RequestMapping("/api") 

Por ejemplo, mi controlador usuario debe extenderse el controlador API de base y también añadir "/" usuarios de la vía, por lo que responderá a "/ API/usuarios" peticiones. Así UserController tendrá:

@Controller 
@RequestMapping("/users") 

pero ya que se extiende ApiController, responderá con eficacia a/API/usuarios.

Naturalmente puedo anteponer "/ api" a todos los controladores para que esto se logre sin la clase padre, pero prefiero hacerlo "de la manera correcta" si es posible, para poder definir mis implementaciones de API con un camino más limpio y más visible.

Intenté extender la clase base ApiController, pero esto no funciona, UserController aún responde a "/ users" e ignora la clase base "/ api".

Respuesta

3

Hmmm. Puede probar esto, es lo que funciona para mí:

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


} 

@Controller 
public class ExtendedAbstractController extends AbstractController { 

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

} 

Note que su clase base debe tener ningún @Controller anotación y debe ser abstracta.

Si intentas extender la clase no abstracta anotada como controlador y que tiene @RequestMapping s obtienes errores en el paso donde se inicializa RequestMappingHandlerMapping.

+1

Hola, lo siento, debo haber perdido tu respuesta de alguna manera. Lamentablemente, esto no hará lo que necesito, ya que quiero que las clases de implementación también tengan su propia asignación "base", por lo que ExtendedAbstractController debe tener una anotación @RequestMapping ("/ another") para que TODOS sus métodos tengan este prefijo. En su solución, solo los métodos con una anotación RequestMapping tendrán una anotación extendida. – TheZuck

+1

@TheZuck sí, veo y sé que no es lo que necesita. : [Solo intenté ayudarte.] En este momento, Spring no admite la herencia de anotaciones como quieras ... Por cierto, puedes ir a Spring JIRA y votar por lo mismo o crear un nuevo problema con tus sugerencias. ;) – masted

0

Puede lograrlo con:

  1. crear la configuración de sub-marco para los controladores con el prefijo mismo camino
  2. crear sub-marco con la propia DispatcherServlet asignada a cierto camino

Mira this answer . Es un problema similar, pero para @RestControllers.

Cuestiones relacionadas