sirve restcontroller que para mvc ejemplo component autowire anotaciones anotacion java spring-mvc controller

java - restcontroller - Controladores de primavera: ¿Puedo llamar a un método antes de llamar a cada método @RequestMapping?



spring mvc anotaciones (6)

Tengo algunos componentes comunes que siempre están presentes en cada página servida por una clase de Controlador dada.

Al comienzo de cada método @RequestMapping, relleno el modelo con estos componentes comunes.

¿Hay alguna manera de definir un método que se llame antes de cada uno de los métodos del controlador para que pueda obtener toda esta copia / pegado en un solo lugar?


Compruebe @ControllerAdvice puede manejar excepciones, modelAttribute usando este


Interceptor es la solución. Tiene métodos preHandler y postHandler, que se llamarán antes y después de cada solicitud, respectivamente. Puede enlazar en cada objeto HTTPServletRequest y también pasar unos pocos al excavarlo.

Aquí hay un código de ejemplo:

@Component public class AuthCodeInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // set few parameters to handle ajax request from different host response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); response.addHeader("Access-Control-Max-Age", "1000"); response.addHeader("Access-Control-Allow-Headers", "Content-Type"); response.addHeader("Cache-Control", "private"); String reqUri = request.getRequestURI(); String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1, reqUri.length()); if (serviceName.equals("SOMETHING")) { } return super.preHandle(request, response, handler); } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); } }


Otro enfoque sería anotar la clase del controlador como un ámbito de solicitud ( @Scope(''request'') ) para que cada solicitud cree una nueva instancia del controlador para invocar el método correspondiente.

Luego, puede poner todo su trabajo de preprocesamiento en un método posterior a la construcción (es decir, un método normal anotado con @PostConstruct ) al que siempre se llamará después de que se inicialice una nueva instancia de controlador (es decir, se cree y se resuelvan todas las dependencias) y antes de Se invoca el método de coincidencia de solicitud.

Supongo que esto sería un poco ineficiente si la inicialización del controlador sea pesada (por ejemplo, cálculos costosos o muchas dependencias para resolver); pero todavía es otro enfoque a este problema.


Sí, puedes usar un interceptor . Puedes definirlos por <mvc:interceptors>

Otra opción es usar el Filter s, pero no podrá inyectar frijoles de primavera en él.


Todos los métodos que tienen la anotación @ModelAttribute se invocan antes del controlador específico y los valores de retorno se agregan a la instancia del Modelo. Luego puedes usar estos atributos en tus vistas y como parámetros de manejador.

He encontrado este blog muy útil.


Simplemente anota un método con @ModelAttribute

Lo siguiente agregaría una instancia de Foo al modelo con el nombre "foo"

@ModelAttribute("foo") public Foo foo() { return new Foo(); }

Ver la documentación de @ModelAttribute