# XML Konfiguration + Struts2



## Sempah (26. Mai 2009)

Hallo zusammen,

da ich ich meiner WebAnwendung auf eine DB zugreife, habe ich die Daten in eine Art config.xml gepackt, von der ich innerhalb der WebAnwendung zugreifen möchte.

Hier meine Projektstruktur:


```
project
-src
  -de.package.app
    -DbAnzeigen.java
  -de.package.app.util
    -Config.java
    -ConfigReader.java
  -struts.xml
-configuration
  -configuration.xml
-WebContent
  -pages
    -DbAnzeigen.jsp
  -WEB-INF
    -lib
    -web.xml
  -index.html
```

- index.html starten -> Link auf DbAnzeigen.action -> zeigt auf de.package.app.DbAnzeigen.java -> result: DbAnzeigen.jsp

- in der DbAnzeigen.java rufe ich meinen ConfigReader auf und deseralisiere die configuration.xml in ein JavaObjekt (Config.java). 


```
....
public String execute() {
  Config config = ConfigReader.getConfig();
  String dbUrl = config.getDbUrl();
  ...
```

Jedoch wird die Datei "configuration.xml" nicht gefunden (-> configuration.xml (Das System kann die angegebene Datei nicht finden) 
Jetzt habe ich schon versucht die Datei an sämtlichen Stellen hinzukopieren, aber nichts klappt.

Wenn ich eine normale Java-Class mit main-Methode schreibe und 

```
private Config config = ConfigReader.getConfig();
String dbUrl = config.getDbUrl();
```

... ausführe, wird die Datei gefunden und auch der korrekte Wert ausgegeben. 
Es scheint also irgendwie ein Problem innerhalb der "Struts2"-Java Class zu sein.

Hat jmd einen Vorschlag?


----------



## maki (26. Mai 2009)

Denke das Problem ist, dass die confiuguration.xml wohl im Classpath liegen sollte, also unter src.


----------



## Sempah (27. Mai 2009)

Das liegt nicht daran.

Hier mein ConfigReader:


```
public class ConfigurationReader {
	
	private static final String CONFIGURATION_XML = "configuration.xml";
	private static Config config = new Config();
		
	public static Config getConfig() {
		try {
			JAXBContext context = JAXBContext.newInstance(Config.class);
			Unmarshaller um = context.createUnmarshaller();
			config = (Config) um.unmarshal(new FileReader(CONFIGURATION_XML));
		} catch (JAXBException jae) {
			System.out.println(jae.getMessage());
		} catch (IOException ioe) {
			System.out.println(ioe.getMessage());
		}
		return configuration;
	}
}
```

Aufruf der Config in einer "normalen" Klasse (funktioniert):

```
public class Test {

	private static Config config;
	
	public static void main(String[] args) {
		config  = ConfigReader.getConfig();
		System.out.println(config.getParameterX());
	}	
}
```

Aufruf innerhalb der Struts2 Datei (funktioniert nicht):

```
private Config config;

public String execute() {
   config  = ConfigReader.getConfig();
   String parameterX = config.getParameterX();
```

configuration.xml befindet sich im project\src\ Verzeichnis


----------



## maki (27. Mai 2009)

> configuration.xml befindet sich im project\src\ Verzeichnis


Dann liegt sie ja jetzt im Classpath 

Landet die XML Datei auch im bin Ordner?


----------



## Sempah (27. Mai 2009)

bin habe ich nicht -.-
Aber falls du das "WEB-INF\classes" - Verzeichnis meinst, ja da ist sie. Genauso wie die struts.xml (welche benötigt wird).

Ich satrte nach wie vor das Project aus der IDE heraus und es wird temporär im folgenden Verzeichnis ausgeführt:

workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\projectx


----------



## maki (27. Mai 2009)

Würde nciht über einen FileReader gehen, da dieser eine Datei (samt Pfad) erwartet, würde die Datei als RessourceStream vom ClassLoader laden lassen.


----------



## Sempah (27. Mai 2009)

Irgendetwas kommt mir da spanisch vor:


```
config = (Config) um.unmarshal(ClassLoader.getSystemResourceAsStream(CONFIGURATION_XML));
```

lasse mir jetzt zusätzlich via System.out.println(configuration.getParameterX()); in der ConfigReader-Datei einen Parameter angeben.

Wenn ich dies nun von der "normalen" Java Datei aufrufe erhalte ich den Inhalt von ParameterX.
Aus der WebApp erhalte ich immer noch nichts. Folgende Exception:

Exception: is parameter must not be null
Exception: [Ljava.lang.StackTraceElement;@7f8062
null

----

null wäre die Ausgabe von ParameterX


// EDIT: ahh Cnfig.class.getResourceAsStream..


----------

