2011-12-01 33 views
6

Estoy estudiando Spring 3 y lo estoy usando en una aplicación web simple.URL @RequestMapping codificada en Spring MVC Controller

Ahora estoy implementando un controlador Spring MVC usando anotaciones, y me pregunto: ¿Hay alguna mejor práctica al usar la anotación @RequestMapping?

quiero decir: Yo he visto que por lo general la URL asignada en esta anotación está codificada en la clase ...
¿Hay una manera de pasar la dirección URL en una 'forma imprecisa' (para obtener una mayor clase reutilizable)?

Sé que hay algunos comodines que se pueden utilizar, pero creo que esa no es la solución ... ¿Estoy equivocado?

EDIT:

añado un ejemplo para explicar mejor mi duda.

Supongamos que deseo que mi controlador se active mediante una solicitud al /foo/bar/baz/mypage.htm, en mi controlador el método del controlador se anotará con @RequestMapping("/foo/bar/baz/mypage").

Ahora decido cambiar la dirección URL que activa mi controlador en /foo/bar/otherpage.htm, así que tengo que editar mi clase, poner @RequestMapping("/foo/bar/otherpage") en el método de mi manejador, recompilar el proyecto e implementarlo nuevamente.

Me parece no tan práctico ...

+0

¿Qué significa 'url dinámico'? ¿Construido en tiempo de ejecución? En tu código java? – soulcheck

+0

@soulcheck Disculpe ... 'Dinámico' no es la palabra correcta ... Lo que quiero decir es que pasa una URL a la anotación sin codificarla en la clase. Podría decir en 'forma ligeramente acoplada'. (He editado la publicación) – davioooh

+0

@David C .: ¿Por qué quieres hacer esto? - "¿Hay alguna buena práctica ...?", Pregunté porque las Mejores prácticas siempre están motivadas por un motivo. – Ralph

Respuesta

5

controladores Actualmente anotados no son muy configurables.

Hasta donde yo sé, el único enfoque posible para este problema es usar la alternativa HandlerMappings para configurar las "URL base" de los controladores. Por ejemplo, de la siguiente manera:

// Note the absense of @Controller to prevent this controller 
// from being discovered by DefaultAnnotationHandlerMapping 
public class FooController { 
    @RequestMapping("/list") public String list(...) { ... } 
    @ReqeustMapping("/save") public String save(...) { ... } 
} 

.

<bean 
    class = "org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping" /> 

<bean name = "/foo" class = "FooController" /> 
<bean name = "/bar" class = "FooController" /> 

En este ejemplo dos instancias de FooController manejan /foo/list, /foo/save, /bar/list y /bar/save respectivamente.

El próximo Spring 3.1 tendrá una arquitectura Spring 3.1 mejorada (Spring 3.1 M2: Spring MVC Enhancements) que parece ser más flexible, aunque todavía no lo he comprobado.

+0

Spring 3.1 M2: Mejoras Spring MVC - movido a https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements –

+0

Y esto probablemente no se admite desde Spring 3.1 –

0

Creo que no es una buena práctica, pero ¿has probado con anotaciones de @PathVariable?

@RequestMapping(value="/path/{word}", method=RequestMethod.GET) 
public ModelAndView myRestMethod(@PathVariable String word) { 
    ... 
} 
+0

Gracias por su sugerencia, pero esto no coincide con mi problema ... :) – davioooh

1

Creo que está tratando de resolver el problema. Si quería cambiar las páginas que coincidían con un controlador, necesitaría cambiar un archivo en algún lugar. ¿Prefiere cambiar el archivo con el código relacionado debajo de él, o, prefiere trabajar con algunos archivos XML que especifican la URL y la clase, y luego debe preocuparse de que el archivo esté en el lugar correcto durante el tiempo de ejecución?

Como debería ser almost no code in your controller de todos modos, debería pensar en sus controladores como archivos de configuración compilables.Además, si está utilizando un sistema de compilación como Maven o Ant y no compila archivos individuales manualmente utilizando Javac, el tiempo de compilación no debería ser un problema. Si se convierte en uno, probablemente sea el momento de dividir su proyecto en subproyectos.

Creo que deberías abrazar esto y ver que probablemente no es el problema que crees que es. Además, ¿sabía que los controladores pueden coincidir con expresiones y no solo con cadenas literales? Eso te da cierta flexibilidad en tu nombre.

Si realmente quieres, puedes recurrir al Spring 2.0 style XML configuration, pero no creo que nadie lo recomiende.

Cuestiones relacionadas