# [RichFaces] Applikation wird mit NullPointerException beendet



## LinuxDjihad (28. Okt 2009)

Hallo,

ich möchte eine Rich-Faces-Applikation aus einem Tutorial (RichFaces Developer Guide) testen, da ich bald beruflich zu tun habe und ich mich schon mal vorab damit beschäftigen will. Dummerweise bekomme ich das Ding einfach nicht zum Laufen. Der Versuch, die Applikation zu laden, endet mit folgendem Fehler:


```
java.lang.NullPointerException
	java.lang.String.startsWith(String.java:1421)
	java.lang.String.startsWith(String.java:1450)
	org.ajax4jsf.webapp.WebXml.getFacesResourceKey(WebXml.java:189)
	org.ajax4jsf.webapp.WebXml.getFacesResourceKey(WebXml.java:222)
	org.ajax4jsf.resource.InternetResourceService.serviceResource(InternetResourceService.java:139)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:508)
```

Die Applikation ist jene aus dem Tutorial. Dabei verstehe ich eines sowieso nicht. In jedem Tutorial wird nie davon gesprochen, dass man von einer JSP-Index-Seite auf die eigentlich JSF-Startseite umleiten muss. Ohne diese Umleitung habe ich eine JSF-Site aber noch nie zum Laufen bekommen. Wieso wird da nie darauf hingewiesen?

Zum eigentlichen Problem und hier mal der von mir verwendete Quellcode:

src->demo [package]
(Hier hielt man sich nicht an die Java-Konvention, aber ich habe es derweil so adaptiert, denn die Groß- und Kleinschreibung bei Beans in Config-Files und in der Verwendung ist ja auch wieder so eine eigene Sache. Ich wollte zur Fehlervermeidung das Bsp. aus dem Tutorial nicht ändern)


```
package demo;

public class user {

	   private String name="";

	   public String getName() {
	      return name;
	   }

	   public void setName(String name) {
	      this.name = name;
	   }
}
```

index.jsp
Hier habe ich diese Umleitung eingebaut, von der ich sprach. Übrigens würde ein <jsp:forward> anstatt http-equiv dazu führen, dass der Server in eine Endlosschleife mit kontinuierlich produzierenden Fehlermeldungen gerät! Dies ist aber nur bei dieser Applikation so. Bei normalen JSF-Seiten habe ich das Problem nicht. Das Verzeichnis "faces" gibt es zwar nicht, aber durch das Mapping findet Tomcat üblicherweise das File. Wie gesagt, mir ist nicht klar, warum man die JSF-Seite (in dem Fall die RichFaces-Seite) nicht direkt ansteuern kann. Immerhin bleibt der Server nicht mehr in einer Endlossschleife hängen. Diese Teillösung habe ich von dieser Seite: Nabble - MyFaces - Users - faces forewarding


```
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="faces/page1.jsp" />
</body>
</html>
```

page1.jsp

```
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<!-- RichFaces tag library declaration -->
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
      <head>
            <title>RichFaces Greeter</title>
      </head>
      <body>
            <f:view>
                  <a4j:form>
                        <rich:panel header="RichFaces Greeter" style="width: 315px">
                              <h:outputText value="Your name: " />
                              <h:inputText value="#{user.name}" >
                                    <f:validateLength minimum="1" maximum="30" />
                              </h:inputText>                        
                              <a4j:commandButton value="Get greeting" reRender="greeting" />
                              <h:panelGroup id="greeting" >
                                    <h:outputText value="Hello, " rendered="#{not empty user.name}" />
                                    <h:outputText value="#{user.name}" />
                                    <h:outputText value="!" rendered="#{not empty user.name}" />
                              </h:panelGroup>
                        </rich:panel>
                  </a4j:form>
            </f:view>
      </body>
</html>
```

Hier die Config-Files:
faces-config.xml


```
<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
    version="1.2">
   <managed-bean>
      <description>UsernName Bean</description>
      <managed-bean-name>user</managed-bean-name>
      <managed-bean-class>demo.user</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
      <managed-property>
         <property-name>name</property-name>
         <property-class>java.lang.String</property-class>
         <value/>
      </managed-property>
   </managed-bean>
</faces-config>
```

web.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>RichFacesGreeter</display-name>
<!-- <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list> -->
  <servlet>
    <servlet-name>FacesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  
  <login-config>
   <auth-method>BASIC</auth-method>
   </login-config>
  <!-- Plugging the "Blue Sky" skin into the project -->
<context-param>
   <param-name>org.richfaces.SKIN</param-name>
   <param-value>blueSky</param-value>
</context-param>
<!-- Making the RichFaces skin spread to standard HTML controls -->
<context-param>
      <param-name>org.richfaces.CONTROL_SKINNING</param-name>
      <param-value>enable</param-value>
</context-param>
<!-- Defining and mapping the RichFaces filter -->
<filter> 
   <display-name>RichFaces Filter</display-name> 
   <filter-name>richfaces</filter-name> 
   <filter-class>org.ajax4jsf.Filter</filter-class> 
</filter> 
<filter-mapping> 
   <filter-name>richfaces</filter-name> 
   <servlet-name>FacesServlet</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>INCLUDE</dispatcher>
</filter-mapping>
</web-app>
```


Im lib-Verzeichnis des Projekts befinden sich folgende JARs:
commons-beanutils-1.8.1-javadoc.jar
commons-beanutils-1.8.1-sources.jar
commons-beanutils-1.8.1.jar
commons-beanutils-bean-collections-1.8.1.jar
commons-beanutils-core-1.8.1.jar
commons-collections-3.2.1-javadoc.jar
commons-collections-3.2.1-sources.jar
commons-collections-3.2.1.jar
commons-collections-testframework-3.2.1.jar
commons-digester-2.0-javadoc.jar
commons-digester-2.0-sources.jar
commons-digester-2.0.jar
commons-logging-1.1.1-javadoc.jar
commons-logging-1.1.1-sources.jar
commons-logging-1.1.1.jar
commons-logging-adapters-1.1.1.jar
commons-logging-api-1.1.1.jar
commons-logging-tests.jar
jsf-api.jar
jsf-impl.jar
jstl.jar
richfaces-api-3.3.2.SR1.jar
richfaces-impl-3.3.2.SR1.jar
richfaces-ui-3.3.2.SR1.jar

Übrigens finde ich es auch erstaunlich, dass ich bisher keine JSF-Applikation zum Laufen bekommen habe, wenn ich anstatt des Hineinkopieren sämtlicher JARs nach lib diese JARs im Projekt nur als externe JARs verlinkt habe. Auch von diesem Phänomen wird in keinem Tutorial etwas erwähnt. 

Ich hoffe, dass mir jemand dabei helfen kann den Fehler zu finden, damit ich weiß, was da alles schief läuft.

Als Entwicklungsumgebung verwende ich Eclipse (Ganymede, aber aktualisiere gerade auf die neue Version).


----------



## LinuxDjihad (28. Okt 2009)

Aus irgend einem Grund scheint es an der Umleitung zu liegen. Wenn ich in der Config das Servlet-Mapping zu folgendem ändere...

```
<url-pattern>*.faces</url-pattern>
```

und die jsp-Seite im Browser anstatt mit page1.jsp mit page1.faces aufrufe, funktioniert die ganze Sache offensichtlich. Da stellt sich mir die Frage, wieso die Applikation weiß, dass sie page1.jsp aufrufen soll, wobei doch nirgendwo eine Weiterleitung von *.faces auf *.jsp deklariert wird? Kann mir jemand erklären, warum das funktioniert?


----------



## LinuxDjihad (29. Okt 2009)

Weiters wäre auch interessant zu wissen, wieso der Submit-Button keine Reaktion hervorruft. Die Applikation startet, wie gesagt, zwar aber sie funktioniert offensichtlich nicht richtig.


----------



## LinuxDjihad (2. Nov 2009)

Hab die falsche Mojarra-Implementierung verwendet. Verwendeich 1.2 statt 2.0 funktioniert die ganze Sache.


----------



## bronks (4. Nov 2009)

LinuxDjihad hat gesagt.:


> ... Übrigens finde ich es auch erstaunlich, dass ich bisher keine JSF-Applikation zum Laufen bekommen habe, wenn ich anstatt des Hineinkopieren sämtlicher JARs nach lib diese JARs im Projekt nur als externe JARs verlinkt habe. Auch von diesem Phänomen wird in keinem Tutorial etwas erwähnt.
> 
> ... Eclipse ...


Das ist eine ausschließliche Macke von Eclipse, die schon seit Ewigkeiten bekannt ist, aber wenn man danach frägt, dann weiß niemand etwas davon. 

Kannst ja gerne hier (http://www.java-forum.org/ides-tools/90332-paar-fragen-eclipseee3-5-a.html) noch danach fragen und was dazu schreiben. 

Um seine erste HelloWorldApp mit JSF auf Tomcat zum laufen zu bringen braucht man mit Eclipse Stunden, wenn nicht gleich Tage. Einem Anfänger, der MicroSofts Visual Studio und .NET noch nie gesehen hat gebe ich maximal 5 Minuten, um eine WebApp zu bauen, die der von Dir o.g. entspricht.


----------



## bronks (4. Nov 2009)

Sorry hab fast vergessen zu erwähnen: Umgehen kann man das o.g. Problem wenn man in den Eigenschaften für Tomcat angibt "Use Tomcat installation ... ..." 

Aber es bleibt dabei: Die Defaulteinstellungen sind nichtfunktionierender Schrott.


----------

