JSF NullPointerException auf validator methode

byemute

Mitglied
Guten Mittag miteinander,

Bin soeben wieder auf ein Problem gestossen mit meiner Registrierungs Seite.

Mir wird eine NullPointerException auf meine validator Methode ausgeworfen:
Code:
/register.xhtml @39,69 validator="#{registerBean.validateUser}": java.lang.NullPointerException


register.xhtml
HTML:
<!--
	This is the register screen. Welcome to Noten Verwalter.
-->
<!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"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.prime.com.tr/ui">

<h:head>
	<title>Registrierung für Notenverwalter</title>
	<link type="text/css" rel="stylesheet" href="themes/bluesky/skin.css" />
</h:head>
	<h:body>
		<center>
			<p:panel header="Register Form" style="width: 350;">
				<h:form>
					<h:panelGrid columns="2" cellpadding="2">
						<h:outputLabel for="LoginName" value="#{msgs.accountname}" />
						<h:panelGroup>
							<h:inputText id="LoginName" value="# {registerBean.userName}"
								required="true" size="15"
								binding="#{registerBean.register}" />
						</h:panelGroup>
			
						<h:outputLabel for="Password" value="#{msgs.password}" />
						<h:panelGroup>
							<p:password id="Password" value="#{registerBean.password}"
								required="true" size="15" feedback="true" />
						</h:panelGroup>
						
						<h:outputLabel for="repeatPassword" value="#{msgs.repeatPassword}" />
						<h:panelGroup>
							<p:password id="repeatPassword" value="#{registerBean.repeatPassword}"
								required="true" size="15"
								validator="#{registerBean.validateUser}" feedback="false" />
						</h:panelGroup>
						
						<h:outputLabel for="Vorname" value="#{msgs.vorname}" />
						<h:panelGroup>
							<h:inputText id="Vorname" value="#{registerBean.vorname}"
								required="true" size="15" />
						</h:panelGroup>
						
						<h:outputLabel for="Nachname" value="#{msgs.nachname}" />
						<h:panelGroup>
							<h:inputText id="Nachname" value="#{registerBean.nachname}"
								required="true" size="15" />
						</h:panelGroup>
						
						<h:outputLabel for="Klasse" value="#{msgs.klasse}" />
						<h:panelGroup>
							<h:selectOneRadio id="Klasse" value="#{registerBean.klasse}" required="true">
		   						<f:selectItem itemValue="1" itemLabel="5IA09" />
		   						<f:selectItem itemValue="2" itemLabel="5IS09" />
							</h:selectOneRadio>
						</h:panelGroup>
					</h:panelGrid>
		
					<p:commandButton id="registerButton"  ajax="false" type="submit" value="#{msgs.registerb}" action="#{registerBean.register}" />
					<p:commandButton value="#{msgs.cancel}" type="reset"/>
				</h:form>
			</p:panel>
			<div><p:messages ></p:messages></div>
		</center>
	</h:body>
</html>

registerBean.java
Java:
package beans;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.naming.NamingException;

@ManagedBean
@RequestScoped
public class RegisterBean {
	private UIInput UIregister;
	public String userName;
	public String vorname;
	public String nachname;
	public String password;
	public String repeatPassword;
	public String klasse;
	
	public RegisterBean() {}
	
	// Validator_Methode: Überprüft ob in DB User mit diesem Passwort existiert
	 public void validateUser(FacesContext context, UIComponent component, Object value) throws SQLException, NamingException {
		userName = (String) UIregister.getLocalValue();
       try {
           String sql = "SELECT username FROM user WHERE username = '" + userName + "'";
          // String sql = "SELECT name, vorname FROM user WHERE username = '" + userName + "' AND password = '" + value.toString() + "'";
           ResultSet rs = dataBaseBeans.DatabaseManager.getDatebaseManager().sendQuery(sql);
           if (!rs.next()) {
           	System.out.println("User existiert NICHT");
           }
           else {
           	FacesMessage message = new FacesMessage("User existiert schon!");
     			context.addMessage(component.getClientId(context),message);
     			message.setSeverity(FacesMessage.SEVERITY_ERROR);
     			throw new ValidatorException(message);	
           }
       } catch (SQLException e) {
       	System.out.println(e.getMessage());
       }
	}
	
      public void register() throws SQLException, NamingException {
    	  boolean isValidPw = validatePassword();
    	  if(isValidPw) {
    		  System.out.println("Password Is Valid");
    		  int role_fk = 1;
    		  //String sql = "insert into user values ("+ Integer.valueOf(klasse)+ ", 1, "+ userName +", "+ password +", "+ nachname +", "+ vorname +");";
    		  String sql = "INSERT INTO user " 
    			    + "(klasse_fk, role_fk, username, password, name, vorname) "
    			    + "VALUES "
    			    + "('" + Integer.valueOf(klasse) + "',"
    			    + "('" + role_fk + "',"
    			    + "('" + userName + "',"
    			    + "('" + password + "',"
    			    + "('" + nachname + "',"
    			    + "('" + vorname + "')";
              try {
              	dataBaseBeans.DatabaseManager.getDatebaseManager().sendUpdate(sql);
              	System.out.println("Erfolgreich Inserted");
              } catch (Exception e) {
                  System.out.println(e.getMessage());
              }  
    	  } else {
    		  
    	  }
      }
      
      public boolean validatePassword() {
    	  boolean isValid = false;
    	  if((password.equals(repeatPassword) && password !=null)) {
    		  isValid = true;
    	  }
    	  return isValid;
      }
	
	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
    public String getNachname() {
        return nachname;
    }
    
    public void setNachname(String nachname) {
        this.nachname = nachname;
    }
    
    public String getVorname() {
        return vorname;
    }
    
    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getRepeatPassword() {
		return repeatPassword;
	}

	public void setRepeatPassword(String repeatPassword) {
		this.repeatPassword = repeatPassword;
	}
	
	public String getKlasse() {
		return klasse;
	}

	public void setKlasse(String klasse) {
		this.klasse = klasse;
	}

	// Methode setzt die loginID welche zur Validation gebraucht wird. Wird an "userid" aus login.xhtml gebunden
	public void setRegister(UIInput UIregister) {
		this.UIregister = UIregister;
		System.out.println("Setted the register UIInput");
	}
	 
	public UIInput getRegister() {
		return UIregister;
	}

}

web.xml
[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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>PrimesTest</display-name>
<welcome-file-list>
<welcome-file>index.xhtml</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>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>resources.application</param-value>
</context-param>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
</web-app>
[/XML]

faces-config.xml
[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_2_0.xsd"
version="2.0">

<!-- Settings for application -->
<application>
<locale-config>
<default-locale>de</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
<message-bundle>beans.messages</message-bundle>
<resource-bundle>
<base-name>beans.messages</base-name>
<var>msgs</var>
</resource-bundle>
</application>

</faces-config>
[/XML]

Ich hoffe ich bin nicht blind und habe etwas falsch geschrieben.

Vielen Dank schonmal für die Hilfe
 
G

gman

Gast
Muss man eigene nicht durch eine Annotation kennzeichnen (@Validator)? Oder war das nur
wenn man eine eigenen Validatorklasse nutzt?
 

byemute

Mitglied
Ich habe es mir von einem schon bestehenden Projekt abgeschaut.

Dort wird beim login auch das binding in das inputfeld vom username gesetzt und der validator beim passwort.

Meiner Meinung nach müsste es also so eigentlich schon richtig sein

edit:

Hab es jetzt mal ohne validator probiert, da passiert einfach nichts.
Ob ich es mit einem <h:commandbutton> oder mit einem <p:commandbutton> mache.

Habe zur sicherheit mal nocht die methode register in registerUser umbenannt, was auch keine auswirkungen hatte..
 
Zuletzt bearbeitet:

byemute

Mitglied
Bin nun eigentlich den ganzen nachmittag drangessesen und hab nach vielem ausprobieren die lösung für mich gefunden.

Wie es aussieht war mein SQL Query nicht sauber escaped.

Das Query ist aus der RegisterBackingBean.java zur überprüfung ob es den User bereits gibt

Wie es nun ist:

String sql = "SELECT username FROM user WHERE user.username = ' " + userName + " ' ";

Wie es war:

String sql = "SELECT username FROM user WHERE user.username = " + userName + " ";
 
Zuletzt bearbeitet:

byemute

Mitglied
Ja, ist mir sehr wohl klar.

Da dies jedoch ein Projekt für die Schule ist und dies nicht unter den Bewertungskriterien war habe ich es mal aussen vorgelassen. Vorallem mal weil ich einfach keine Zeit für sowas hatte, hatte ne Woche Zeit da ich nicht mehr mit meinem Projektpartner arbeiten wollte.

Aber um nochmal wirklich auf deine Feststellung zu kommen,
In PHP wüsste ich jetzt wie, aber in JSF habe ich keinen Plan wie es da läuft, in JSF hab ich schon nur mühe zu validieren ob der user eingeloggt ist ^^.

Falls du lust hast kannst du ja noch schnel schreiben wie es mit JSF funktionieren würde :p
 

waldek87

Mitglied
Dann ist das halb so schlimm ;)
Die Login Daten würde ich in einer Session Bean halten.
Da würde ich ein Phaselistener empfehlen um zu prüfen, ob die Session Bean noch existiert.

In dem Beispiel ist relativ einfach erklärt, wie man einen Phaselistener erstellt und registriert.
JSF PhaseListener – Is This User Logged In? aaronbartell

An die Werte einer Session Bean könntest du so ran kommen:

Java:
FacesContext context = FacesContext.getCurrentInstance();
	  CountryBean country = (CountryBean) context.getApplication().getExpressionFactory()
            .createValueExpression(context.getELContext(), "#{country}", CountryBean.class)
              .getValue(context.getELContext())

Viel Spaß damit ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F NullPointerException auf validator methode Teil2? Web Tier 2
O NullPointerException bei CDI Web Tier 4
S NullPointerException in ManagedBean? Web Tier 4
J NullPointerException bei Outputwriter Web Tier 9
S NullpointerException requestgetParameterValues Web Tier 17
C NullPointerException Web Tier 4
L [RichFaces] Applikation wird mit NullPointerException beendet Web Tier 5
G SCHWERWIEGEND: NullPointerException bei Tomcat Web Tier 4
R Zugriff Validator in Tabelle (ui:repeat) auf andere Felder Web Tier 2
C Clientseitiger Validator in rich:calendar Web Tier 6
A Validator Message in JSF Web Tier 5
M JSF Zugriff auf mehrere Formulareinträge in einem Validator Web Tier 9
M Ist Dependency Injection im Validator möglich? Web Tier 15
F Frage zum Validator Web Tier 2
G JSF Validator und fortsetzen der Anwendung Web Tier 2
S Button klick soll Java methode aufrufen Web Tier 2
M JSF JSF: Methode bei versteckt aufrufen & Parameter übergeben Web Tier 6
R get-methode der Managed-Bean wird immer 3 mal ausgeführt Web Tier 4
Joew0815 Spring Handle All Requests Methode Web Tier 1
M rendered ruft eine Methode auf, andere aber nicht Web Tier 15
V Mittels JavaScript Methode aufrufen Web Tier 23
M JSF Button - Methode wird nicht aufgerufen Web Tier 4
K JSF Unified-EL- Methode mit Parameterübergabe Web Tier 9
P Mit EL Parameter an Methode übergeben Web Tier 5
I Im PhaseListener Service Methode aufrufen Web Tier 21
J JSF Datatable bestimmte Methode Web Tier 4
I Automatische Weiterleitung JSF mit Aufruf einer Methode Web Tier 2
M JSF: Bei Seitenaufruf eine Methode starten Web Tier 15
H JSF - Methode kann nicht aufgerufen werden Web Tier 5
M Body onUnload Java Methode aufrufen Web Tier 13
K bean methode von jslt aufrufen Web Tier 7
D <html:select> bzw. <html:option> - Methode auslösen ? Web Tier 2
D [JSF] Lifecycle Methode wird mehrfach aufgerufen Web Tier 4
F Problem mit der Methode request.getRemotePort() Web Tier 2
D Methode bei Server Startup ausführen Web Tier 2
E Methode einer Bean aus anderer Bean aufrufen Web Tier 10
S JSF: Methode mit Parametern aufrufen Web Tier 7
J Fehler Tomcat/JSP findet Methode nich Web Tier 3
G Mit JSTL Rückgabe von Bean Methode ausgeben Web Tier 3
G in validate methode auf form objekte zugreifen Web Tier 3
A Action-Methode soll Ausgabe auf der Responsepage steuern Web Tier 4
F Beim Aufruf von einer JSF Seite eine Methode ausführen Web Tier 9

Ähnliche Java Themen

Neue Themen


Oben