Seam-Projekt Eingabefeld mit "null"-Wert

thommy.s

Aktives Mitglied
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:

HTML:
<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.

Java:
@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:

Code:
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
 
S

SlaterB

Gast
> 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
 
Zuletzt bearbeitet von einem Moderator:

thommy.s

Aktives Mitglied
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
 
Zuletzt bearbeitet:
S

SlaterB

Gast
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

Aktives Mitglied
...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:

Code:
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.
 
S

SlaterB

Gast
> 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:
Java:
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

Bekanntes Mitglied
Was Slater glaub ich sagen wollte ist folgendes:
Java:
(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
Java:
title1.length
von nichts
ab (da title = null ist) so bekommst du natürlich einen Fehler.

Was du machen möchtest ist folgendes:
Java:
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

Aktives Mitglied
@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
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J facesContext ist null bei seam-Projekt Web Tier 3
T Seam Anwendung EAR-Projekt Web Tier 3
N JSF [Maven] Seam 2.2, Richfaces 3.3 - a4j wird nicht umgewandelt Web Tier 6
J seam 2 sprache ändern Web Tier 3
T Seam-Komponenten oder Java Bean soll direkt nach Appserver-Start "leben" Web Tier 4
D Seam Example Probleme Web Tier 2
J a4j-MediaOutput / Seam 2.1 : jpg lassen sich nur bis 5 KB anzeigen Web Tier 3
T JSF/Facelets mit Seam-Framework Web Tier 7
P Richfaces/Seam: RichShuttleListe funktioniert nicht Web Tier 8
D Richfaces (Seam/Hibernate): dynamische Eingabefelder Web Tier 2
S JSF xhtml-Files in seperatem Projekt Web Tier 0
K Vaadin Projekt Funkioniert nicht... Web Tier 1
F JSF javax.el.PropertyNotFoundException bei kleinem JSF-Projekt Web Tier 3
M RichFaces zerstörte mein Projekt Web Tier 4
Kenan89 WebSocket in Eclipse Web Projekt implementieren Web Tier 19
L Web-Projekt Projekt in Eclipse classes Ordner? Web Tier 6
T Sprachenauswahl für Projekt Web Tier 3
B JSF JSF1.1 @Tomcat 5.5 für ein neues Projekt Web Tier 18
Scorpi41 RequestDispatcher eine anderes Projekt zugreifen Web Tier 8
N JSP literatur zu jsp,jsf projekt Web Tier 2
C Eclipse: Einbinden externer Projekte in Web-Projekt Web Tier 10
F Web-Projekt als LIB - wie geht das? Web Tier 7
T Tomcat Projekt ohne Eclipse starten Web Tier 11
D Struts2 Combobox ohne Eingabefeld Web Tier 2

Ähnliche Java Themen

Neue Themen


Oben