myFaces 1.2 - kein ServletContext ?

Status
Nicht offen für weitere Antworten.

y0dA

Top Contributor
Hi!
Wie ich gerade feststellen musste funktioniert das nicht mehr:
Code:
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

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

y0dA

Top Contributor
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

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

maki

Gast
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.
 

y0dA

Top Contributor
Ja wenn ich nun aber die servlet-api hinzufüge:
Code:
<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:
Code:
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:
Code:
<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?
 
U

unkreativ

Gast
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben