Existe-t-il un moyen d'accéder aux propriétés web.xml à partir d'un bean Java ?

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

  •  09-06-2019
  •  | 
  •  

Question

Existe-t-il un moyen dans l'API Servlet d'accéder aux propriétés spécifiées dans web.xml (telles que les paramètres d'initialisation) à partir d'une classe Bean ou Factory qui n'est pas du tout associée au conteneur Web ?

Par exemple, j'écris une classe Factory et j'aimerais inclure une certaine logique dans Factory pour vérifier une hiérarchie de fichiers et d'emplacements de configuration pour voir lesquels, le cas échéant, sont disponibles pour déterminer quelle classe d'implémentation instancier - par exemple,

  1. un fichier de propriétés dans le classpath,
  2. un paramètre web.xml,
  3. une propriété système, ou
  4. une logique par défaut si rien d'autre n'est disponible.

J'aimerais pouvoir le faire sans injecter aucune référence à ServletConfig ou quelque chose de similaire à mon usine - le code devrait pouvoir s'exécuter correctement en dehors d'un conteneur de servlet.

Cela peut sembler un peu inhabituel, mais j'aimerais que ce composant sur lequel je travaille puisse être empaqueté avec l'une de nos applications Web, et qu'il soit également suffisamment polyvalent pour être empaqueté avec certains de nos outils de ligne de commande sans nécessitant un nouveau fichier de propriétés uniquement pour mon composant - j'espérais donc m'appuyer sur d'autres fichiers de configuration tels que web.xml.

Si je me souviens bien, .NET a quelque chose comme Request.GetCurrentRequest() pour obtenir une référence à l'exécution en cours Request - mais comme il s'agit d'une application Java, je recherche quelque chose de similaire qui pourrait être utilisé pour accéder à ServletConfig.

Était-ce utile?

La solution

Une façon de procéder est la suivante :

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;
    }
}

Et puis ayez ce qui suit dans votre web.xml

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

Si votre application s'exécute dans un conteneur Web, l'écouteur sera invoqué par le conteneur une fois le contexte créé.Dans ce cas, _servletContextProperties sera remplacé par tous les paramètres de contexte spécifiés dans le web.xml.

Si votre application s'exécute en dehors d'un conteneur Web, alors _servletContextProperties sera vide.

Autres conseils

Avez-vous envisagé d'utiliser le framework Spring pour cela ?De cette façon, vos beans ne reçoivent aucune quantité supplémentaire et Spring gère la configuration pour vous.

Je pense que vous devrez ajouter une classe d'amorçage associée qui prend une référence à un ServletConfig (ou ServletContext) et transcrit ces valeurs dans la classe Factory.Au moins de cette façon, vous pouvez l'emballer séparément.

@boîte à outils :Excellent, très humble - C'est quelque chose que j'essaie de faire depuis un moment

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top