Tomcat et filtre de requête et classloader

Tomcat et filtre de requête et classloader - Java - Programmation

Marsh Posté le 09-09-2010 à 17:03:21    

Bonjour,
 
Je cherche juste à implémenter un filtre sur la reception d'une requête dans tomcat.
Alors tout est OK mais dans la méthode init() du filtre, je cherche à loader un ressource bundle (toto.properties) pour avoir une map des cles/valeurs dans le code.
Le problème est que je n'arrive pas à loader le ressource bundle qui est pourtant dans le classpath.
Voici le code (qui normalement marche car je l'ai récupérer) :
 

Code :
  1. @Override
  2. public void init(FilterConfig conf) throws ServletException {
  3.  String propsLocation = conf.getInitParameter( "mappingFileLocation" );
  4.  if (propsLocation == null)
  5.  {
  6.   log.warn( "No filter init parameter 'mappingFileLocation' set (should refer to file in classpath)" );
  7.   propsLocation = "themefilter.properties";
  8.  }
  9.  props = new Properties();
  10.  try
  11.  {
  12.   //Get the System Classloader
  13.   ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();
  14.   //Get the URLs
  15.   URL[] urls = ((URLClassLoader) sysClassLoader).getURLs();
  16.   for (URL url : urls)
  17.   {
  18.    System.out.println( url.getFile() );
  19.   }
  20.   URL url = Thread.currentThread().getContextClassLoader()
  21.     .getParent().getResource( propsLocation );
  22.   InputStream propsStream = this.getClass().getResourceAsStream(
  23.     propsLocation );
  24.   if (propsStream != null)
  25.   {
  26.    props.load( propsStream );
  27.   }
  28.   else
  29.   {
  30.    log.warn( "Filter file " + propsLocation
  31.      + " couldn't be read in classpath" );
  32.   }
  33.   log.debug( "Successfully read site to theme properties file from "
  34.     + propsLocation + " in classpath" );
  35.  }
  36.  catch (IOException e)
  37.  {
  38.   log.warn( "Failed to read theme properties from "
  39.     + propsLocation
  40.     + " (mappingFileLocation filter init parameter) in classpath." );
  41.  }
  42. }


 
 
Alors dans l'instruction  

Code :
  1. System.out.println( url.getFile() );


 
J'affiche les classpath normalement de mon thread courant (unique) et ça m'affiche  
 

/C:/alfresco-community-tomcat-share-dev-3.3g/tomcat/bin/bootstrap.jar
/C:/Program%20Files/Java/jdk1.6.0_21/lib/tools.jar


 
Je suppose que mon .properties dans WEB-INF/classes est dans le classpath pourtant....et pourtant impossible de le charger !
 
J'ai essaié en rajoutant le code :
 

Code :
  1. URL url = Thread.currentThread().getContextClassLoader()
  2.     .getParent().getResource( propsLocation );


 
mais url est toujours null (comme inputStream d'ailleurs)
 
Voici le code dans le web.xml :
 

Code :
  1. <filter>
  2.  <description>Add theme parameter to requests</description>
  3.        <filter-name>ThemeFilter</filter-name>
  4.        <filter-class>fr.intuitiv.module.fds.servlet.ThemeFilter</filter-class>
  5.        <init-param>
  6.                <description>Location of mapping file from sites to themes</description>
  7.                <param-name>mappingFileLocation</param-name>
  8.                <param-value>themefilter.properties</param-value>
  9.        </init-param>
  10.   </filter>
  11.    <filter-mapping>
  12.        <filter-name>ThemeFilter</filter-name>
  13.         <url-pattern>/page/site/*</url-pattern>
  14.   </filter-mapping>


 
Une idée ?

Reply

Marsh Posté le 09-09-2010 à 17:03:21   

Reply

Marsh Posté le 10-09-2010 à 10:26:20    

Et en passant par le ServletContext, ça donne quoi ?

Code :
  1. conf.getServletContext().getResourceAsStream("/WEB-INF/classes/" + propsLocation);


 
Sinon, ceci devrait marcher aussi

Code :
  1. this.getClass().getClassLoader().getResourceAsStream(propsLocation);


Reply

Marsh Posté le 17-09-2010 à 10:05:54    

Merci pour la réponse, mais finalement j'ai mis mon .properties dans le dossier shared.loader pointé dans le catalina.properties (bibliotheques partagés aux webapp).
Et avec l'instruction  
 

Code :
  1. URL url = Thread.currentThread().getContextClassLoader()
  2.     .getParent()
  3.     .getResource( "alfresco/extension/" + propsFilename );


 
c ok.
Je n'ai pas testé ta piste, qui est malgré tout intéressante.
 
Merci  :jap:


Message édité par Giz le 17-09-2010 à 10:11:38
Reply

Marsh Posté le 17-09-2010 à 10:54:17    

Ce que je comprends pas, c'est le but du "getParent()". En faisant ça, tu es sûr de rater le classloader de l'application...

Reply

Marsh Posté le 17-09-2010 à 14:24:59    

Oui c'est vrai quand tu le dis en regardant la doc :
 
 

   Bootstrap
          |
       System
          |
       Common
      /      \
 Catalina   Shared
             /   \
        Webapp1  Webapp2 ...


 
 
mais de toute façon je souhaite externaliser la config de l'appli web (un bundle .war)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed