# Seam-Projekt Eingabefeld mit "null"-Wert



## thommy.s (24. Jan 2011)

Hallo alle zusammen,

folgendes Problem stellt sich mir bei einer Tabelle mit Eingabefeldern, von denen die meisten "Pflichtfelder" sind, eins jedoch noch, siehe Code-Auszug:


```
<ui:define name="body">
		<h:form>
			<h:panelGrid columns="2" border="1">
				<f:facet name="header">
					<h:outputText value="Registrierung" />
				</f:facet>	
					<h:outputText value="Login-Name" rendered="#{register.renderUsername()}"/>
					<h:inputText id="loginname" value="#{data.username_first}" rendered="#{register.renderUsername()}" required="true" styleClass="eingabefeld">
						<h:message for="loginname" errorClass="errorMessage"/>
					</h:inputText>									
					<h:outputText value="Titel" />
					<h:inputText value="#{data.title}" styleClass="eingabefeld"/>
					<h:outputText value="Nachname" />
					<h:inputText id="surname" value="#{data.surname}" required="true" errorClass="errorMessage" styleClass="eingabefeld">
						<h:message for="surname" errorClass="errorMessage"/>
					</h:inputText>
```

Das Feld "title" soll kein Pflichteingabefeld sein, wenn es leer bleibt, soll dass die "angeschlossene" Bean (siehe folgender Code-Auszug) hinnehmen. 


```
@Name("data")
@Scope(ScopeType.CONVERSATION)
public class DataTable implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -3474681428750868166L;
	private String title;
	private String surname;
	private String givenname;
	private String depart;
	private String mail;
	private String username;
	private String username_stud;
	private String username_first;
	private String passwd;
	
	private String tmpGivenname;
	private String tmpSurname;
	private String tmpUsername;
	
	boolean editGivenname = false;
	boolean editSurname = false;
	boolean editUsername = false;

	public String getTitle() {
		

		return title;
	}
	public void setTitle(String title1) {
		
		if ((title1.length() > 0) || (title1 != null))
		
			title1 = UpperCases.names(title1);
		

		this.title = title1;
	}
	
	public String getSurname() {
		return surname;
	}
	public void setSurname(String surname) {
						
		if (this.tmpSurname != null) {	
									
			if(!(this.tmpSurname.equalsIgnoreCase(surname)) || (this.surname == null)) {
				
				this.editSurname = true;
				
			} else {
				
				this.editSurname = false;
				
			}			
	
		}
		
		this.tmpSurname = surname;
						
		surname = UpperCases.names(surname);
		
		this.surname = surname;	
		
	}
	
	public String getGivenname() {		
		
		return givenname;
	}
	public void setGivenname(String givenname) {	
		
		if(this.tmpGivenname != null) {
		
			if(!(this.tmpGivenname.equalsIgnoreCase(givenname))) {
				
				this.editGivenname = true;
				
			} else {
				
				this.editGivenname = false;
				
			}
			
		}
		
		this.tmpGivenname = givenname;
		
		givenname = UpperCases.names(givenname);
		
		this.givenname = givenname;
```


Die quittiert das allerdings  mit einem:


```
Error writing 'title' on type org.thommys.regusers.entity.DataTable
```

sobald ich das Feld leerlasse. Fehlt mir da noch eine entsprechende Annotation, und falls ja, welche?


Freu mich über jeden Tipp

Gruß Thomas


----------



## SlaterB (24. Jan 2011)

> if ((title1.length() > 0) || (title1 != null))

falls null in der set-Methode ankommt kracht es, überlege da nochmal

und schreibe solche Tests besser nicht in jeder Methode einzeln, bei den anderen settern mit equals hast du ja ewig if+ else,

schreibe z.B.
boolean gleich = Xy.equalIgnoreChase(x1,x2);
mit einer statischen Methode, die alle null und sonstigen Fälle genau abdeckt


----------



## thommy.s (25. Jan 2011)

Hi SlaterB,

deine Antwort versteh' ich grad nicht.

Wenn title1.length > 0 oder Nicht NULL (hmm, bissel unlogisch kommt's mir jetzt auch vor... amKopfKratz)

dann soll er die UpperCases.names(title1)-Methode ausführen (setzt ersten Buchstaben auf Großbuchstaben),

ansonsten setzt er this.title = NULL. (bzw. bleibt er eben NULL, so wie es vorher bereits war)


Verstehe nicht, warum das nicht gehen soll?  

Denkfehler?

Du hast recht, es kracht ja tatsächlich, leider verstehe ich noch nicht, warum.

Grüße Thomas


----------



## SlaterB (25. Jan 2011)

Reihenfolge.., erst auf null prüfen, dann auf die Länge,

wenn null kommt und du title1.length() abfragst, dann ist das eine NullPointerException


----------



## thommy.s (31. Jan 2011)

...Sorry, mich hat's ein paar Tage ein bißchen umgehauen, deshalb erst jetzt.

Ja, ursprünglich hatte ich dies sogar so. Da meldete aber die Eclipse eine Warnung, nämlich:


```
Null pointer access: The variable title1 can only be null at this location.
```

..und zwar beim zweiten Teil der OR-Verknüpfung, oder eben der Prüfung auf Stringlänge == 0

Trotzdem habe ich es testhalber einmal gedreht, Ergebnis ist leider identisch.


----------



## SlaterB (31. Jan 2011)

> Da meldete aber die Eclipse eine Warnung
was dir sagen sollte, dass der Rest noch nicht stimmt, 
aber doch nicht dass du einfach zunächst auf einen null-Test verzichtest..

gehen wir mal von SEAM ganz weg:

```
public class Test
{
    public static void main(String[] args)
    {
        String st = null;
        if (st.length() > 0 || st != null)
        {
            st = st.toLowerCase();
        }
        System.out.println("st: " + st);
    }
}
```
folgendes Programm soll eine Ausgabe liefern, tut es aber noch nicht,
ist es dir möglich, das if so umzuformulieren, dass die Ausgabe am Ende doch noch kommt?


----------



## jwiesmann (31. Jan 2011)

Was Slater glaub ich sagen wollte ist folgendes:

```
(title1.length() > 0) || (title1 != null)
```
schlägt fehl, wenn* title1 *leer ist bzw. null ist.
title1 ist von Typ String und kann auch leer/null sein.

Wenn du dir jetzt vorstellst, du fragst die länge 
	
	
	
	





```
title1.length
```
 von *nichts*
ab (da title = null ist) so bekommst du natürlich einen Fehler.

Was du machen möchtest ist folgendes:

```
title1 != null && title1.length() > 0
```
wenn title1 gesetzt ist springt er in die Bedingung.
Bei einem || kann title null sein und er prüft dann noch weiter ob null.length() *!!!FEHLER* wahr ist. .. was natürlich nicht so ist

Gruß Jörg


----------



## thommy.s (1. Feb 2011)

@SlaterB:

Vielen Dank dir, da hab' ich richtig auf dem Schlauch gestanden. Dabei hätte man es sich per Aufsagen auch klarmachen können. Auf dem Weg hierher (Arbeit) hatte ich ein bißchen Zeit, um über deinen gestrigen Ausspruch nachzudenken...

@jwiesmann

Vielen Dank auch dir, obwohl du mir damit das eigene Nachdenken abgenommen hast... Aber dein Beitrag stimmt 100%ig.

Jedenfalls funzt's nu..  Und es war der letzte (mir bekannte) Fehler im Projekt.


Viele Grüße

Thomas


----------

