java spring struts2 struts-action struts2-config-browser

java - Obtener una lista de acciones configuradas en Struts2



execute struts2 (2)

En un proyecto que utiliza Struts2 (2.3.20), me gustaría ejecutar las acciones configuradas (nombre, clase, espacio de nombres, método) al inicio de la aplicación.

Estoy usando

  • Struts 2.3.20
  • struts-spring-plugin
  • struts-convención-complemento

Como referencia: He hecho un poco de trabajo con los frijoles y la inyección de Struts antes, por lo que no estoy del todo fresco en esto, pero estoy atascado resolviendo el problema aquí indicado.

Cualquier sugerencia sobre cómo obtener esto sería apreciada.

Explicación adicional

Al leer la respuesta de Andrea a continuación, veo que necesito explicar lo que necesito.

Estoy construyendo una función de creación de menú de aplicación para la aplicación. Mi plan es obtener las configuraciones de acción y construir un árbol de "nodos de menú" a partir de información en anotaciones sobre clases de acción y métodos seleccionados.

Mi problema con el código del navegador de configuración es que la Configuration (xwork) no parece estar disponible fuera de los componentes de Struts. Como esta es una tarea de inicio de aplicación, realmente no se ajusta al modelo de componentes MVC de Struts. Me gustaría poner la inicialización del edificio de menú en ServletContextListener .

Ejemplo falso

Por solicitud aquí solo está la conexión actionconfig <-> anotación <-> my_custom_menu. A partir de esto podría producir una estructura de menú proporcionada a partir de las anotaciones sobre clases de acción y métodos.

public class ActionMenuBuilderListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent arg0) { List<ActionCfg> actions = Struts.getConfiguredActions(); // thisi is where I''d like some help for(ActionCfg action : actions) { MenuAnnotation annotation = getAnnotationFromMethodOrClass(action); if(annotation != null) { addMenuItem(action, annotation); } } } }

Aquí ActionCfg es cualquier clase que Struts devuelva para la configuración de acción, Struts.getConfiguredActions() sería una o más llamadas a los componentes de Struts y addMenu(...) es donde agrego un nodo de elemento de menú a mi estructura. La estructura es más tarde el objetivo de JSP-s para construir menús.

No sé cuánto más código escribir.

Mi solución

Por completitud, pensé incluiré lo que salió de esto.

Primero, me conecté a Struts a través de ServletContextListnere :

public class ActionMenuBuilderListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { } @Override public void contextInitialized(ServletContextEvent event) { ActionMenuDispatcherListener listener = new ActionMenuDispatcherListener(); ServletContext context = event.getServletContext(); listener.setServletContext(context); Dispatcher.addDispatcherListener(listener); } }

Entonces, escribí DispatcherListener :

public class ActionMenuDispatcherListener implements DispatcherListener { private ServletContext servletContext; ... @Override public void dispatcherInitialized(Dispatcher dispatcher) { Map<String, PackageConfig> packages = dispatcher .getConfigurationManager().getConfiguration() .getPackageConfigs(); Map<String, Map<String, ActionConfig>> runtimeActionConfigs = dispatcher .getConfigurationManager().getConfiguration() .getRuntimeConfiguration().getActionConfigs(); for (String packageKey : runtimeActionConfigs.keySet()) { Map<String, ActionConfig> actionConfigs = runtimeActionConfigs .get(packageKey); for (String actionKey : actionConfigs.keySet()) { ActionConfig actionConfig = actionConfigs.get(actionKey); PackageConfig packageConfig = packages.get(actionConfig .getPackageName()); if (packageConfig != null) { String actionName = actionConfig.getName(); String namespace = packageConfig.getNamespace(); try { ActionMenu methodAnnotation = getMethodAnnotation(actionConfig); if (methodAnnotation != null) { String annotationInfo = methodAnnotation.value(); log.debug("[{}, {}, {}]", namespace, actionName, annotationInfo); } } catch (ClassNotFoundException e) { log.error("{}: {}", e.getClass().getSimpleName(), e.getMessage()); } } } } } protected ActionMenu getMethodAnnotation(ActionConfig actionConfig) throws ClassNotFoundException { String className = actionConfig.getClassName(); String methodName = actionConfig.getMethodName(); Class<?> actionClass = Class.forName(className); try { Method method = actionClass.getDeclaredMethod(methodName, null); ActionMenu annotation = method.getAnnotation(ActionMenu.class); return annotation; } catch (NoSuchMethodException | SecurityException e) { // log.error("{}: {}", e.getClass().getSimpleName(), // e.getMessage()); } return null; } }

En caso de que alguien más esté pensando en esa línea :)


En primer lugar, debe enganchar en el proceso de inicialización de la aplicación después de cargar y analizar las configuraciones. Una de las formas es implementar DispatcherListener que debe agregar al Dispatcher . Esto se puede hacer en ServletContextListener#contextInitialized método ServletContextListener#contextInitialized .

La segunda pieza del rompecabezas es para obtener configuraciones de acción. Esto es bastante simple porque la instancia del Dispatcher se pasa como argumento al método dispatcherInitialized . Para obtener todas las configuraciones de acción actuales, obtenga RuntimeConfiguration que contiene datos en Map<String, Map<String, ActionConfig>> , donde la primera clave del mapa es el espacio de nombres del paquete, la segunda clave del mapa es el nombre de la acción y ActionConfig contiene toda la información sobre la acción. Como necesita un nombre de clase, entonces use el método getClassName() .

public class ActionMenuBuilderListener implements ServletContextListener,DispatcherListener { @Override public void contextInitialized(ServletContextEvent sce) { Dispatcher.addDispatcherListener(this); } @Override public void dispatcherInitialized(Dispatcher du) { Map<String, Map<String, ActionConfig>> runtimeActionConfigs = du .getConfigurationManager().getConfiguration().getRuntimeConfiguration() .getActionConfigs(); } // other methods }

Y, por supuesto, no olvide registrar su oyente en web.xml.


Estás libre de construir esto para tu crecimiento personal, pero ten cuidado de que ya exista .

Se llama struts2-config-browser-plugin-2.3.20.jar ( struts2-config-browser-plugin-2.3.20.jar ).

Está incluido por defecto con los arquetipos Maven, y debe recordar eliminarlo antes de entrar en producción.

Una vez importado, está disponible en la URL:

//www.SERVER_NAME.com:8080/WEBAPP_NAME/ config-browser / actionNames

Te da la información exacta que estás buscando: acciones, métodos, resultados, parámetros, mapeos, etc. y se ve así: