# myFaces 1.2 - kein ServletContext ?



## y0dA (25. Feb 2008)

Hi!
Wie ich gerade feststellen musste funktioniert das nicht mehr:

```
ServletContext sc = (ServletContext) fc.getExternalContext().getContext();
```

Gibts hierzu eine Alternative?
Ich möchte auf ein Config File in meinem Webprojekt zugreifen, welches im WEB-INF liegt..


----------



## y0dA (26. Feb 2008)

Ok dann stelle ich die Frage anders, wie kann ich in myFaces 1.2 auf Properties Files zugreifen (keine absoluten Pfade)?


----------



## HLX (26. Feb 2008)

Kenne zwar myFaces nicht, aber woran erkennst du, dass o.g. Code nicht mehr funktioniert? Ich finde keinen Hinweis darauf in der API.

myfaces.apache.org/core12/javadoc.html


----------



## y0dA (26. Feb 2008)

Ganz einfach, weil ich die Klasse *ServletContext* nicht mehr importieren kann - oder sollte die sowieso nicht im myFaces.core sein?

Welches JAR benötige ich für SerlvetContext?

Für myFaces 1.x.x war es im *serlvet-api-2.4.jar*. nun benutzt myFaces 1.2.x aber schon 2.5 ?


----------



## HLX (26. Feb 2008)

ServletContext gehört zur Servlet-API (servlet-api.jar). Hat nichts mit myFaces zu tun.


----------



## maki (26. Feb 2008)

ServletContext ist Teil der Servlet API.

JSF hat nicht mehr nur etwas mit Servlets und JSP zu tun, musst selbst dafür sorgen das die jars vorhanden sind.


----------



## HLX (26. Feb 2008)

myFaces.apache.org hat gesagt.:
			
		

> JSF 1.2 requires java 1.5 or later, JSP 2.1, JSTL 1.2 and a Java Servlet 2.5 implementation.



Diese Vorraussetzungen musst du für die Entwicklung schaffen.


----------



## y0dA (26. Feb 2008)

Ja wenn ich nun aber die servlet-api hinzufüge:

```
<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
```

und die Webapplikation starte, bekomme ich folgende Exception:

```
SCHWERWIEGEND: Exception starting filter extensionsFilter
java.lang.ClassCastException: org.apache.myfaces.webapp.filter.ExtensionsFilter cannot be cast to javax.servlet.Filter
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:255)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4356)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
```

Also ich hab nun folgende JARs importiert:

```
<dependencies>
		<dependency>
			<groupId>org.apache.myfaces.core</groupId>
			<artifactId>myfaces-api</artifactId>
			<version>1.2.2</version>
			<scope>compile</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.myfaces.core</groupId>
			<artifactId>myfaces-impl</artifactId>
			<version>1.2.2</version>
			<scope>compile</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.myfaces.tomahawk</groupId>
			<artifactId>tomahawk</artifactId>
			<version>1.1.6</version>
			<scope>runtime</scope>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>jstl</artifactId>
				</exclusion>
			</exclusions>
		</dependency>


		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<artifactId>log4j</artifactId>
			<groupId>log4j</groupId>
			<version>1.2.8</version>
		</dependency>

		<dependency>
			<groupId>oracle</groupId>
			<artifactId>ojdbc</artifactId>
			<version>14</version>
		</dependency>

		<dependency>
			<groupId>org.codehaus.xfire</groupId>
			<artifactId>xfire-jaxb2</artifactId>
			<version>1.1.1</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
		</dependency>


	</dependencies>
```

Bekomme aber nach wie vor die Exception (ohne servlet-api gibts keine Exception)

Sicher dass myFaces-core nicht eh schon servlet-api 2.5 als JAR besitzt?


----------



## y0dA (26. Feb 2008)

KEiner eine Idee wo das Problem liegt wenn ich das servlet-api JAR einbinde?


----------



## unkreativ (23. Mrz 2008)

Hallo,

du hast einen Fehler in der Maven-Konfiguration gemacht und zwar hast du den Scope der Servlet-Dependency nicht auf "provided" gesetzt, auch wenn du es vorerst so beschrieben hast (also am Anfang deines Beitrags). Das Problem dabei ist, dass der ClassLoader normalerweise dann dein Servlet-API Archiv hernimmt für diese eine Webanwendung (Parent First vs. Parent Last als ClassLoader Setting) und dementsprechend kennt der Servlet-Container die MyFaces-Klassen nicht (da ja eine andere Servlet API verwendet wird). Das heißt ein Filter ist kein Filter, auch wenn er das Interface Filter implementiert  :autsch: . Hat alles seine Richtigkeit, nur falls du es dennoch nicht verstanden haben solltest, schau dir einfach die ClassLoading Thematik noch einmal an. 

Die Lösung des Problems ist aber wie gesagt recht einfach, da du in deiner Konfiguration nur "<scope>provided</scope>" zur Servlet-Dependency hinzufügen musst. Daran erkennt Maven, dass du diese Dependency zwar zum Kompilieren benötigst (da du ja auf den ServletContext zugreifen willst), diese aber nicht mit in das Archiv geben willst, da sie eh vom Container bereitgestellt wird (= provided). 

grüße,
unkreativ


----------

