Problem bei Beispiel in 'Workshop Java EE 7'

Ich habe Probleme bei einem Beispielprojekt aus dem Buch ‘Workshop Java EE 7’. Vielleicht findet ja einer von euch den möglichen Fehler.
Fehlermeldung des JBoss:

exception

javax.servlet.ServletException: /spendeFormEdit.xhtml: The class 'de.ritda.myaktion.controller.SpendeFormEditController$Proxy$_$$_WeldClientProxy' does not have the property 'doOk'.
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)

Die Klasse SpendeFormEditController.java:


import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;

import de.ritda.myaktion.model.Aktion;

@SessionScoped
@Named
public class SpendeFormEditController implements Serializable {
	private static final long serialVersionUID=-4210085664588144340L;
	private String textColor="000000";
	private String bgColor="ffffff";
	private Aktion aktion;
	
	public String doOk(){
		return Pages.AKTION_LIST;
	}
	
	private String getAppUrl(){
		HttpServletRequest req=(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
		String scheme=req.getScheme();
		String serverName=req.getServerName();
		int serverPort=req.getServerPort();
		String contextPath=req.getContextPath();
		return scheme+"://"+serverName+":"+serverPort+contextPath;
	}
	
	public String getUrl(){
		return getAppUrl()+"/"+Pages.GELD_SPENDEN+".jsf"+"?bgColor="+bgColor+"&textColor="+
				textColor+"&aktionId="+aktion.getId();
	}
	
	public String getTextColor(){
		return textColor;
	}
	
	public void setTextColor(String textColor){
		this.textColor=textColor;
	}
	
	public String getBgColor(){
		return bgColor;
	}
	
	public void setBgColor(String bgColor){
		this.bgColor=bgColor;
	}
	
	public Aktion getAktion(){
		return aktion;
	}
	
	public void setAktion(Aktion aktion){
		this.aktion=aktion;
	}

}

spendeFormEdit.xhtml:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<ui:composite xmlns=“http://www.w3.org/1999/xhtml
xmlns:ui=“http://www.java.sun.com/jsf/facelets
xmlns:f=“http://www.java.sun.com/jsf/core
xmlns:h=“http://www.java.sun.com/jsf/html
template="/WEB-INF/templates/default.xhtml">
<ui:define name=“content”>

Spendenformular bearbeiten


<h:form>
<h:panelGrid columns=“2”>
<h:outputLabel value=“Hintergrundfarbe:”></h:outputLabel>
<h:selectOneMenu id=“bgColor”
value="#{spendeFormEditController.bgColor}">
<f:selectedItem itemLabel="#FFFFFF" itemValue=“FFFFFF” />
<f:selectedItem itemLabel="#000000" value=“000000” />
<f:selectedItem itemLabel="#FF0000" value=“FF0000” />
<f:ajax render=“url” />
</h:selectOneMenu>
<h:outputLabel value=“Textfarbe:”></h:outputLabel>
<h:selectOneMenu id=“textColor”
value="#{spendeFormEditController.textColor}">
<f:selectedItem itemLabel="#FFFFFF" itemValue=“FFFFFF” />
<f:selectedItem itemLabel="#000000" value=“000000” />
<f:selectedItem itemLabel="#FF0000" value=“FF0000” />
<f:ajax render=“url” />
</h:selectOneMenu>
<h:outputLabel value=“URL des Formulars:”></h:outputLabel>
<h:inputTextArea id=“url” rows=“6” cols=“30” readonly=“true”
value="#{spendeFormEditController.url}" />
</h:panelGrid>
<h:commandButton value=“OK” action="#{spendeFormEditController.doOk}" />
</h:form>
</ui:define>
</ui:composite>[/XML]

Hat jemand eine Ahnung?

mit public String url() hättest du dasselbe Problem zwei Zeilen davor hinsichtlich .url, aber so heißt deine Methode ja nicht, oder?
getter und setter sind in Java ziemlich heilig, nach genauen Prinzipien:

  • die ‘property’ mit mindestens zwei Kleinbuchstaben beginnen, doOk geht, url auch, schlecht wäre URL oder uRL, glaube ich
  • getter und setter dann get/set + Property-Namen mit ersten Buchstaben in groß, Rest exakt gleich,
    nicht schwer zu merken, bei getUrl() und den anderen ok, ergo getDoOk()

mit String und Rückgabewert, also getter-Aufruf ist das ziemlich sichere Sache,
wenig genau weiß ich es mangels Praxis zu boolean (zu Property ok gibt es dann auch Methode isOk() statt getOk() )
sowie zum Aufruf normaler Aktions-Methoden, Rückgabewert void

Url ist eine Variable mit Getter und Setter und wird im xhtml mit dem Attribut ‚value‘ abgerufen während die Methode ‚doOk‘ mit dem Attribut ‚action‘ aufgerufen wird. Müsste meines Erachtens schon stimmen.
:cool:Die Heiligkeit von Gettern und Settern ist mir bekannt mit Java beschäftige ich mich schon ein paar Jährchen.

Das mit der action ist schon richtig und funktioniert auch. Werde es später noch mal bei daheim mit der vollen Bean etc. testen.

tjaja, ‘mangels Praxis’ erlaubt alle Fehler bei mir

‘commandButton value action jsf “does not have the property”’ in Suchmaschine liefert diesen Thread hier erst auf Seite 3, noch steigerungsfähig,
sonst wenig interessantes, am ehesten noch commandButton ohne form-Tag, was hier nicht vorliegt, oder commandButton in einem Kommentar, was hier auch nicht vorliegt:
http://www.coderanch.com/t/523226/JSF/java/javax-el-PropertyNotFoundException-Property-logoutUser

bei Beispielcode ist auch nicht mit eigenen Änderungen zu rechnen, Abweichung vom Buch?,

was selten der Fall ist aber von mir immer mal angenommen wird:
geänderter Code aus beliebigen Gründen nicht bei der Ausführung ankommen, Programm sieht veraltete Klasse?

sofern du nichts anderes zu tun hast, kannst du aber ja spaßeshalber spätestens nun modifizieren:
füge testweise getDoOk() in die Klasse hinzu, geht es dann?
oder ändere andersrum auch testweise die xhtml auf url in der action, welche testweise dann irgendeinen kurzen Dummy-Text, keine komplizierte URL liefern sollte

eine Lösung wäre es nicht, nur interessant zu wissen ob dann alles abläuft,
und es kommt ja HTML raus, im Browser angezeigt?, vielleicht dieses HTML posten, vielleicht ist ein Hinweis zu erkennen

vereinzelt habe ich auch ()-Aufrufe gesehen: action="#{spendeFormEditController.doOk()}"
womöglich gab das aber dann nur deswegen nicht Fehler, weil immer schon andere Fehler auftraten…

okay hab nochmal genauer drüber geschaut und nicht überflogen:

  • es gibt kein <f:selectedItem> nur ein <f:selectItem>
  • überall Itemvalue verwenden nicht value und itemvalue gemischt
  • h:inputTextArea gibt es nicht! Nur h:inputTextarea

Zu der “PropertyNotFoundException” das scheint ein Bug zu sein:

https://java.net/jira/browse/JAVASERVERFACES-1806

So wird immer eine “PropertyNotFoundException” geworfen, die das eigentliche Problem verdeckt.

probiere mal diesen “TestCode” der läuft jetzt einwandfrei bei mir:

<h1>Spendenformular bearbeiten</h1>
        <h:form>
            <h:panelGrid columns="2">
                <h:outputLabel value="Hintergrundfarbe:"></h:outputLabel>
                <h:selectOneMenu id="bgColor"
                    value="#{spendeFormEditController.bgColor}">
                    <f:selectItem itemLabel="#FFFFFF" itemValue="FFFFFF" />
                    <f:selectItem itemLabel="#000000" itemValue="000000" />
                    <f:selectItem itemLabel="#FF0000" itemValue="FF0000" />
                    <f:ajax render="url" />
                </h:selectOneMenu>
                <h:outputLabel value="Textfarbe:"></h:outputLabel>
                <h:selectOneMenu id="textColor"
                    value="#{spendeFormEditController.textColor}">
                    <f:selectItem itemLabel="#FFFFFF" itemValue="FFFFFF" />
                    <f:selectItem itemLabel="#000000" itemValue="000000" />
                    <f:selectItem itemLabel="#FF0000" itemValue="FF0000" />
                    <f:ajax render="url" />
                </h:selectOneMenu>
                <h:outputLabel value="URL des Formulars:"></h:outputLabel>
                <h:inputTextarea id="url" rows="6" cols="30" readonly="true"
                    value="#{spendeFormEditController.url}" />
            </h:panelGrid>
            <h:commandButton value="OK" action="#{spendeFormEditController.doOk}" />
        </h:form>

import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;

@SessionScoped
@Named
public class SpendeFormEditController implements Serializable {
	private static final long serialVersionUID = -4210085664588144340L;
	private String textColor = "000000";
	private String bgColor = "ffffff";

	public String doOk() {
		return "hello3";
	}

	private String getAppUrl() {
		return "hello";
	}

	public String getUrl() {
		return "hello";
	}

	public String getTextColor() {
		return textColor;
	}

	public void setTextColor(String textColor) {
		this.textColor = textColor;
	}

	public String getBgColor() {
		return bgColor;
	}

	public void setBgColor(String bgColor) {
		this.bgColor = bgColor;
	}

}

Zu den aufgetretenen Problemen:
pl4gu33- Deine Anmerkungen waren alle richtig. Diese Fehler kamen teilweise zustande da Eclipse die Datei nicht als JSF behandelt hat. ZB. Keine Autocompletition. Nach Neuanlegen der Datei und deinen vorgeschlagenen Änderungen läuft alles. Ich hatte versucht vorher nur die Änderungen durchzuführen, allerdings wurde die Datei beim ausführen scheinbar nicht korrekt gehandelt. Wie gesagt neu angelegt, den angepassten Code hineinkopiert und es lief.