Es allí una manera de acceder a web.xml las propiedades de un Bean Java?

StackOverflow https://stackoverflow.com/questions/41659

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Hay alguna forma en el Servlet API para acceder a las propiedades especificadas en web.xml (tales como parámetros de inicialización) desde dentro de un Bean de Fábrica o en la clase que no está asociado con el contenedor web?

Por ejemplo, estoy escribiendo una clase de Fábrica, y me gustaría incluir algunos dentro de la lógica de la Fábrica para comprobar una jerarquía de archivos y configuración de ubicaciones para ver si hay alguna disponible para determinar qué clase de implementación para crear una instancia - por ejemplo,

  1. una de las propiedades de archivo en la ruta de clases,
  2. un web.xml parámetro,
  3. un sistema de propiedad, o
  4. algunos lógica predeterminada si no hay nada más disponible.

Me gustaría ser capaz de hacer esto sin la inyección de cualquier referencia a ServletConfig o algo parecido a mi de Fábrica el código debe ser capaz de ejecutar aceptar fuera de un Contenedor de Servlets.

Esto puede sonar un poco raro, pero me gustaría para este componente en el que estoy trabajando para ser capaz de ir de la mano con uno de nuestros webapps, y también ser lo suficientemente versátil como para ser envasados con algunas de nuestras herramientas de línea de comandos sin necesidad de un nuevo archivo de propiedades sólo para mi componente - así que estaba esperando a caballito encima de otros archivos de configuración, tales como web.xml.

Si recuerdo correctamente, .NET tiene algo parecido Request.GetCurrentRequest() para obtener una referencia a la que se está ejecutando actualmente Request - pero ya que esta es una aplicación Java que estoy buscando algo simliar que podría ser utilizado para obtener acceso a ServletConfig.

¿Fue útil?

Solución

Una manera de hacer esto es:

public class FactoryInitialisingServletContextListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent event) {
    }

    public void contextInitialized(ServletContextEvent event) {
        Properties properties = new Properties();
        ServletContext servletContext = event.getServletContext();
        Enumeration<?> keys = servletContext.getInitParameterNames();
        while (keys.hasMoreElements()) {
            String key = (String) keys.nextElement();
            String value = servletContext.getInitParameter(key);
            properties.setProperty(key, value);
        }
        Factory.setServletContextProperties(properties);
    }
}

public class Factory {

    static Properties _servletContextProperties = new Properties();

    public static void setServletContextProperties(Properties servletContextProperties) {
        _servletContextProperties = servletContextProperties;
    }
}

Y, a continuación, tienen el siguiente en su web.xml

<listener>
    <listener-class>com.acme.FactoryInitialisingServletContextListener<listener-class>
</listener>

Si la aplicación se ejecuta en un contenedor web, entonces el oyente será invocado por el contenedor una vez que el contexto ha sido creado.En cuyo caso, el _servletContextProperties va a ser reemplazado por cualquier contexto-parámetros especificados en el web.xml.

Si la aplicación se ejecuta fuera de un contenedor web, a continuación, _servletContextProperties estará vacía.

Otros consejos

Ha considerado el uso del framework Spring para esto?De esa manera, su frijoles no conseguir cualquier resto adicional, y la primavera se encarga de la configuración de la instalación para usted.

Creo que se le tiene que agregar un asociado de bootstrap de la clase que toma una referencia a un ServletConfig (o ServletContext) y transcribe los valores de Fábrica de la clase.Al menos de esta manera usted puede empaquetar por separado.

@toolkit :Excelente, más humilde - Esto es algo que he estado tratando de hacer durante un tiempo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top