Tengo un menú basado en datos (en caché) y es un componente global. Quiero poder insertar los elementos del menú para cada solicitud, ya que cada página va a usarlo. ¿Cuál es el mejor lugar para ponerlo? Estoy usando la anotación basada en Spring3. La mejor solución que se me ocurre es usar un filtro OncePerRequest y agregarlo allí o subclasificar el controlador, pero no estoy seguro de cómo hacerlo con la anotación @Controller.¿Cuáles son las mejores prácticas para establecer los atributos del modelo global en Spring MVC?
Respuesta
puedo pensar en dos opciones fáciles:
Cada clase @Controller
expone los datos como un método anotado con @ModelAttribute
, p.ej
@ModelAttribute
public MyData getMyData() {
...
}
Sin embargo, eso no es muy bueno si tienes varios controladores. Además, esto tiene el molesto efecto secundario de codificar el myData
en la URL para cada redirección
Sugiero que implemente un HandlerInterceptor
y exponga los datos a cada solicitud de esa manera. No puede usar ninguna anotación-lovin, pero está mejor separada de la lógica de su negocio de esta manera. Esto es similar a su idea OncePerRequestFilter
, pero una pero más Spring-y.
Puede implementarlo como HandlerInterceptor
.
Consulte también:
Acabo de encontrar una respuesta para la misma pregunta. Es parte de mi mensaje:
Sólo tiene que establecer la variable del modelo exponga atribuye a falso en el RedirectView.
Al iniciar Spring 3.2, puede usar @ControllerAdvice en lugar de utilizar @ExceptionHandler, @InitBinder y @ModelAttribute en cada controlador. Se aplicarán a todos los beans @Controller.
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.WebRequest;
@ControllerAdvice
public class GlobalBindingInitializer {
@InitBinder
public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
}
Si había comenzado con Spring Roo Código generado, o limitar las anotaciones escaneados por componentes de escaneo usando include-filtro, a continuación, añadir el filtro requerido en webmvc-config.xml
<!-- The controllers are autodetected POJOs labeled with the @Controller annotation. -->
<context:component-scan base-package="com.sensei.encore.maininterface" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
<!-- ADD THE BELOW LINE -->
<context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
</context:component-scan>
También puede ser un enlace útil sobre '@ ControllerAdvice' en' Spring 4': http://blog.codeleak.pl/2013/11/controlleradvice- mejoras-en-primavera.html – Andremoniy
Si necesita agregar algunas variables globales para que cada vista pueda resolver estas variables, ¿por qué no definirlas en un mapa o propiedades? Entonces use la primavera DI, refiérase al bean resolvedor de vista. es muy útil, como veriable estático, p. resUrl.
<property name="viewResolvers">
<list>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="attributes" ref="env" />
<property name="exposeContextBeansAsAttributes" value="false" />
<property name="prefix" value="${webmvc.view.prefix}" />
<property name="suffix" value="${webmvc.view.suffix}" />
</bean>
</list>
</property>
- 1. Índices MySQL: ¿cuáles son las mejores prácticas?
- 2. ¿Cuáles son las mejores prácticas para usar los atributos de ensamblaje?
- 3. ¿Cuáles son las mejores prácticas en la interoperabilidad del lenguaje?
- 4. nhibernate: ¿cuáles son las mejores prácticas para implementar la igualdad?
- 5. ¿Cuáles son las mejores prácticas para diseñar esquemas XML?
- 6. ¿Cuáles son las mejores prácticas para repositorios de horno?
- 7. ¿Cuáles son sus mejores prácticas para los proyectos de backbone.js?
- 8. ¿Cuáles son las mejores prácticas para usar Z2 Availability Zones?
- 9. ¿Cuáles son las mejores prácticas para registrar un error?
- 10. ¿Cuáles son las mejores prácticas para los permisos en los directorios de escritura de Apache?
- 11. MVC3 y EF Data first: ¿cuáles son las mejores prácticas?
- 12. ¿Cuáles son las mejores prácticas de Python para las constantes de clave dict del diccionario?
- 13. ¿Cuáles son las mejores prácticas al usar SWIG con C#?
- 14. CSS3 - ¿Cuáles son las mejores prácticas de rendimiento?
- 15. ¿Cuáles son las ventajas prácticas del currying?
- 16. ¿Cuáles son las mejores prácticas para evitar CSS obsoletos y JavaScript?
- 17. ¿Cuáles son las mejores prácticas para los tamaños de campo de datos de cadena?
- 18. ¿Cuáles son las mejores prácticas para usar los Métodos de extensión en .Net?
- 19. ¿Qué son las mejores prácticas de MEF?
- 20. ¿Cuáles son las mejores prácticas para la denominación de los módulos Maven?
- 21. Mejores prácticas para la inicialización del árbol de objetos MVC de Spring MVC
- 22. ¿Cuáles son las herramientas y las mejores prácticas para probar servicios web?
- 23. ASP.NET MVC 3 - Las mejores prácticas para el manejo de Modelo en Ver
- 24. ¿Cuáles son las mejores prácticas para implementar el operador == para una clase en C#?
- 25. ¿Cuáles son las mejores prácticas para actualizar automáticamente las aplicaciones PHP + MySQL?
- 26. ¿Cuáles son las mejores prácticas para la lectura y escritura de datos intensivos en una HD?
- 27. ¿Cuáles son las mejores prácticas para implementar una aplicación Catalyst en un servidor de producción?
- 28. ¿Cuáles son las mejores prácticas para usar el almacenamiento local de subprocesos en .NET?
- 29. ¿Cuáles son las "consecuencias prácticas" del uso de referencias suaves?
- 30. ¿Cuáles son las mejores prácticas para rastrear advertencias/errores en procesos de larga ejecución?
+1 por mencionar el efecto secundario de ModelAttribute. Desearía que alguien me hubiera dicho eso antes :(Gracias por la dirección. –