Spring MVC: uso de Pointcuts para llenar parciales de Spring MVC con datos dinámicos

¿Cómo llena los parciales reutilizables (como el encabezado) en una aplicación web Spring MVC con datos dinámicos como el nombre de usuario cada vez que se llama a un determinado grupo de controladores (controladores de página) pero no para otros (controladores de formulario, ajax, ...)?

encabezamiento:

<#import "../spring.ftl" as spring />
<!DOCTYPE html>
<html>
<head>
<title>DW-Client</title>
</head>
<body>
<h2>Welcome ${menu.userName}</h2>

índice:

<#include "common/header.ftl">
<!-- stuff -->
<#include "common/footer.ftl" />

Esto es una especie de continuación de esta SO publicación. Sin embargo, parece que el chico ya no está activo y quería escuchar algunas opiniones nuevas sobre nuestro enfoque para llenar parciales en una aplicación web spring mvc con datos como menús dinámicos...

El otro chico propuso usar un AbstractController que se extiende por todos los controladores de página y llena una variable a través de un @ModelAttribute método anotado, que parece una buena idea. pero mi pensamiento inicial fue:

¿Por qué no usar AOP con cortes de punta para llenar el ModelAndView.model Uno simplemente anotaría un controlador o método con decir @MenuData. Ahora, cada vez que se llame al control, será interceptado por un aspecto que agrega la información requerida a ModelAndView:

@RequestMapping(value = "/")
@MenuData
public ModelAndView homePath() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("index");        
    return mav;
}


@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MenuData {
}

@Aspect
@Component
public class MenuDataAspect {

    @Inject
    private MenuDataProvider menuDataProvider;


    @Pointcut("within(@MenuData *) && execution(public * * (..))")
    public void menuDataRequested() {            
    }

    @Around("menuDataRequested()")
    public Object provideMenuData(ProceedingJoinPoint pjp) throws Throwable {
        Object output = pjp.proceed();
        ModelAndView mav = (ModelAndView) output;
        mav.getModel().put("menu", menuDataProvider.getMenuData());            
        return mav;
    }

}

Ahora debería poder decir ${menu.userName} o lo que sea en mi encabezado parcial... De esta manera puedo controlar exactamente qué controlador debe tener menuData.

Este concepto se puede hacer aún más flexible diciéndole al pointcut que intercepte todos los controladores que comienzan con la página (no estoy seguro de la sintaxis, pero sé que funcionará, algo así como @Pointcut("within(*.Page*)") o todos los controladores en el paquete pageController o lo que sea.

Por supuesto, también se pueden definir múltiples anotaciones para diferentes escenarios de menú que no dependen de la sesión sino de las páginas.


Así que me pregunto, ¿este enfoque parece una buena idea o hay algún inconveniente? ¿Qué harías diferente/mejor? ¿Qué enfoque usas?

¡Gracias!

preguntado el 12 de junio de 12 a las 11:06

1 Respuestas

AOP parece excesivo para inicializar datos en algunas clases de controlador.

Cuestiono la complejidad de algo que (a) no es un comportamiento de toda la aplicación, (b) está limitado a unos pocos controladores de nivel de página de usuario y (c) puede implementarse mediante la herencia tradicional.

Si bien funcionaría técnicamente, ¿cuál es la razón de peso para no usar la herencia?

Si estuviera proporcionando oversite en esto, tendrías que trabajar más duro para venderme la compensación.

Respondido 02 Feb 13, 16:02

Sí... supongo que es un buen punto... Probablemente estoy subconscientemente sesgado contra la herencia y las anotaciones personalizadas profesionales... Pero tienes razón sobre la capa de complejidad... No me di cuenta porque esos cortes de puntos son bastante básicos y fáciles, pero podría salirse de control rápidamente .. - Pete

@Pete Tampoco soy muy bueno con la herencia, pero en muchos casos modela los requisitos exactamente, especialmente en casos como este donde no hay una reutilización real fuera de la aplicación, y una jerarquía de herencia muy superficial (si la hay) ya en su lugar. I am, sin embargo, anti-AOP cuando se trata de implementar una funcionalidad trivial de hacer a través de medios más convencionales, y yo como AOP, un montón. - David Newton

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.