2010-12-05 5 views
1


Ich muss eine Webanwendung schreiben, die eine Verbindung zur Datenbank herstellt und Verbindungseigenschaften aus der .properties-Datei liest.
Ich benutze Maven und ich möchte einen Komponententest für meine App schreiben.
Klassen Um zu testen, die mit Datenbank arbeitet ich meine .properties auf src/main/resources-Datei setzen und zu testen/main/Ressourcen und schrieb den folgenden Code für das Lesen von Eigenschaften:Laden von .properties in Anwendung für Tomcat

package util; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 
import org.apache.log4j.Logger; 


/** 
* 
* @author proger 
*/ 
public class ProgrammSettings { 

    private static Logger logger = Logger.getRootLogger(); 
    private static String propertiesPath = "program.settings.properties"; 

    private static Properties props; 

    public static String getProperty(String key) { 
     if (props == null) 
      loadProperties(); 

     return props.getProperty(key); 

    } 

    public static void setResourcesFilePath(String path) { 
     propertiesPath = path; 
    } 

    private static void loadProperties() { 
     InputStream propOut = null; 
     try { 
      //URL url = ClassLoader.getSystemResource(propertiesPath); 
      propOut = ClassLoader.getSystemClassLoader().getResourceAsStream(propertiesPath); //new FileInputStream(url.getFile()); 
      props = new Properties(); 
      props.load(propOut); 
     } catch (Exception ex) { 
      //Logger.getLogger(ProgrammSettings.class.getName()).log(Level.SEVERE, null, ex); 
      String errorMessage = "Error during properties file reading. Path to file: '" + 
          propertiesPath + "'"; 
      logger.error(errorMessage, ex); 
      throw new RuntimeException(errorMessage, ex); 
     } finally { 
      try { 
       if (propOut != null) 
        propOut.close(); 
      } catch (IOException ex) { 
       logger.error("Error during closing stream from properties file", ex); 
      } 
     } 
    } 
} 

ich den gleichen Code wollte gearbeitet sowohl für Tests als auch für App-Klassen, also lese ich die Eigenschaftendatei von classPath. Alle meine Tests bestanden und meine .properties-Datei wird von Maven in den Krieg gepackt. Aber wenn ich meine App von Netbeans starte, bekomme ich:

java.lang.NullPointerException 
    java.util.Properties$LineReader.readLine(Properties.java:435) 
    java.util.Properties.load0(Properties.java:354) 
    java.util.Properties.load(Properties.java:342) 
    util.ProgrammSettings.loadProperties(ProgrammSettings.java:49) 
    util.ProgrammSettings.getProperty(ProgrammSettings.java:33) 
    dataacess.AbstractDataMapper.loadDriver(AbstractDataMapper.java:58) 
    dataacess.AbstractDataMapper.<init>(AbstractDataMapper.java:41) 
    dataacess.UserMapper.<init>(UserMapper.java:25) 
    servlets.UserRegistration.processRequest(UserRegistration.java:86) 
    servlets.UserRegistration.doPost(UserRegistration.java:132) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 

Wie kann ich es beheben? Vielen Dank im Voraus

+0

können Sie bitte Ihre Verzeichnisstruktur in Ihrer Frage bearbeiten –

+0

Ich habe Standardverzeichnisstruktur für Maven-Projekt. –

Antwort

1

Platz program.settings.properties in webapps/appname/WEB-INF/classes

Und Sie können eine einfachere Linie ProgrammSettings.class.getResourceAsStream(..) (dh nicht das System Classloader, aber die aktuelle Klassenladeprogramm) verwenden

+0

Maven während der Erstellung put program.settings.properties in .war. Nach dem Deployment und dem Entpacken der .properties-Datei sollte es genau gin webapps/appname/WEB-INF/classes sein. Aber ich habe immer noch den gleichen Fehler. –

+0

@Ivan siehe aktualisiert – Bozho

+0

Vielen Dank. SystemClassLoader lädt nicht, was ich brauche. Nur ProgrammSettings.class ClassLoader kann es tun. –

Verwandte Themen