JSF javax.el.PropertyNotFoundException bei kleinem JSF-Projekt

Fabulus

Mitglied
Hallo,

ich bin neu in JSF und arbeite nun das Buch "Workshop Java EE 7" von Marcus Schießer und Martin Schmollinger durch.

Ich habe ein Webprojekt, welches mit Maven gemanaged wird und JSF verwenden soll. Ich habe Beans "AktionListController" und "AktionListProducer", welche auf der xhtml-Seite angezeigt werden sollen, das
funktioniert nur leider nicht wie ich es will.

Ich verwende Java SE 1.7 und JSF 2.2, gehostet wird das ganze auf einem Tomcat 7. Die Darstellung der Seite funktioniert auch, nur die Beans werden nicht angezeigt (siehe StackTrace)

Hier meine Dateien:

aktionList.xhtml (wie im Buch)
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	template="WEB-INF/templates/default.xhtml">

	<ui:define name="content">
		<h1>Meine Aktionen</h1>
		<h:form acceptcharset="ISO-8859-1">
			
			<h:dataTable value="#{aktionListProducer.aktionen}" var="aktion">
				<h:column>
					<h:commandLink value="x"
						actionListener="#{aktionListController.doDeleteAktion(aktion)}" />
				</h:column>

				<h:column>
					<f:facet name="header">
						<h:outputText value="Name" />
					</f:facet>
					<h:outputText value="#{aktion.name}" />
				</h:column>
				
				<h:column>
					<f:facet name="header">
						<h:outputText value="Spendenziel" />
					</f:facet>
					<h:outputText value="#{aktion.spendenZiel}">
						<f:convertNumber type="currency" currencyCode="EUR"/>
					</h:outputText>
				</h:column>
				
				<h:column>
					<f:facet name="header">
						<h:outputText value="bisher gespendet" />
					</f:facet>
					<h:outputText value="#{aktion.bisherGespendet}">
						<f:convertNumber type="currency" currencyCode="EUR"/>
					</h:outputText>
				</h:column>
				
				<h:column>
					<h:commandLink value="Editieren"
						action="#{aktionListController.doEditAktion(aktion)}">
					</h:commandLink>
				</h:column>
				
				<h:column>
					<h:commandLink value="Spendenliste"
						action="#{aktionListController.doListSpende(aktion)}">
					</h:commandLink>
				</h:column>
				
				<h:column>
					<h:commandLink value="Formular"
						action="#{aktionListController.doEditSpendeForm(aktion)}">
					</h:commandLink>
				</h:column>
				</h:dataTable>
				
				<h:commandButton value="Aktion hinzufügen" action="#{aktionListController.doAddAktion()}" />
				</h:form>
				
	</ui:define>

</ui:composition>

templates/default.xhtml:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
		xmlns:h="http://java.sun.com/jsf/html"
		xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
	<title>My Aktion</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<h:outputStylesheet name="css/screen.css" />
</h:head>
<h:body>
	<div id="container">
		<div id="header">
			<p>
				My Aktion!
			</p>
		</div>
		
		<div id="content">
			<ui:insert name="content">
				[Template content will be inserted here]
			</ui:insert>
		</div>
		
		<div id="footer">
			<p> (C) 2014 dpunkt.verlag GmbH, MIT Lizenz</p>
		</div>
	</div>
</h:body>
</html>

beans.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!-- This file can be an empty text file (0 bytes) -->
<!-- We're declaring the schema to save you time if you do have to configure
this in the future -->
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
Java EE: XML Schemas for Java EE Deployment Descriptors
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
[/XML]

AktionListController
Java:
package de.dpunkt.myaktion.controller;

import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;


import javax.inject.Named;

import de.dpunkt.myaktion.model.Aktion;

@SessionScoped
@Named("aktionListController") // oder auch @ManagedBean(name="aktionListController") oder auch nur @Named
public class AktionListController implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8855059385160293126L;

	public String doAddAktion() {
		System.out.println("Add Aktion");
		return Pages.AKTION_EDIT;
	}

	public String doEditAktion(Aktion aktion) {
		System.out.println("Edit aktion " + aktion);
		return Pages.AKTION_EDIT;
	}
	
	public String doEditSpendeForm(Aktion aktion) {
		System.out.println("Edit Spende Form " + aktion);
		return Pages.SPENDE_FORM_EDIT;
	}

	public String doListSpende(Aktion aktion) {
		System.out.println("List Spende " + aktion);
		return Pages.SPENDE_LIST;
	}

	public void doDeleteAktion(Aktion aktion) {
		System.out.println("Aktion löschen noch nicht implementiert");
	}
	
}

Java:
package de.dpunkt.myaktion.data;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.inject.Named;

import de.dpunkt.myaktion.model.Aktion;
import de.dpunkt.myaktion.model.Konto;
import de.dpunkt.myaktion.model.Spende;
import de.dpunkt.myaktion.model.Spende.Status;

@SessionScoped
@Named("aktionListProducer") // oder auch @ManagedBean(name="aktionListProducer")
public class AktionListProducer implements Serializable {

	private static final long serialVersionUID = 982951686360127738L;
	private List<Aktion> aktionen;

	public AktionListProducer() {
		aktionen = createMockAktionen();
	}

	public List<Aktion> getAktionen() {
		return aktionen;
	}

	public List<Aktion> createMockAktionen() {
		Spende spende1 = new Spende();
		spende1.setSpenderName("Heinz Schmidt");
		spende1.setBetrag(20d);
		spende1.setQuittung(true);
		spende1.setStatus(Status.UEBERWIESEN);
		spende1.setKonto(new Konto(spende1.getSpenderName(), "XXX Bank",
				"123456", "87654321"));

		Spende spende2 = new Spende();
		spende2.setSpenderName("Karl Meier");
		spende2.setBetrag(30d);
		spende2.setQuittung(false);
		spende2.setStatus(Status.IN_BEARBEITUNG);
		spende2.setKonto(new Konto(spende2.getSpenderName(), "YYY Bank",
				"654321", "86427531"));

		List<Spende> spenden = new LinkedList<Spende>();
		spenden.add(spende1);
		spenden.add(spende2);

		Aktion aktion1 = new Aktion();
		aktion1.setName("Trikots fuer A-Jugend");
		aktion1.setSpendenZiel(1000d);
		aktion1.setBisherGespendet(258d);
		aktion1.setSpendenBetrag(20d);
		aktion1.setId(1L);
		aktion1.setKonto(new Konto("Max Mustermann", "ABC Bank", "100200300",
				"12345678"));
		aktion1.setSpenden(spenden);

		Aktion aktion2 = new Aktion();
		aktion2.setName("Rollstuhl fuer Maria");
		aktion2.setSpendenZiel(2500d);
		aktion2.setBisherGespendet(742d);
		aktion2.setSpendenBetrag(25d);
		aktion2.setId(2L);
		aktion2.setKonto(aktion1.getKonto());
		aktion2.setSpenden(spenden);

		List<Aktion> retList = new LinkedList<Aktion>();
		retList.add(aktion1);
		retList.add(aktion2);
		System.out.println(retList.size());
		return retList;
	}

}

Aktion.java
Java:
package de.dpunkt.myaktion.model;

import java.util.List;

public class Aktion {

	private String name;
	private Double spendenZiel;
	private Double spendenBetrag;
	private Double bisherGespendet;
	private Konto konto;
	private Long id;
	private List<Spende> spenden;
	
	public Aktion() {
		konto = new Konto();
	}

	public String getName() {
		return name;
	}

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

	public Double getSpendenZiel() {
		return spendenZiel;
	}

	public void setSpendenZiel(Double spendenZiel) {
		this.spendenZiel = spendenZiel;
	}

	public Double getSpendenBetrag() {
		return spendenBetrag;
	}

	public void setSpendenBetrag(Double spendenBetrag) {
		this.spendenBetrag = spendenBetrag;
	}

	public Double getBisherGespendet() {
		return bisherGespendet;
	}

	public void setBisherGespendet(Double bisherGespendet) {
		this.bisherGespendet = bisherGespendet;
	}

	public Konto getKonto() {
		return konto;
	}

	public void setKonto(Konto konto) {
		this.konto = konto;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public List<Spende> getSpenden() {
		return spenden;
	}

	public void setSpenden(List<Spende> spenden) {
		this.spenden = spenden;
	}
}


Meine Dependencies bzgl Java EE etc sind:
Code:
  <dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<version>6.0</version>
			<scope>provided</scope>
</dependency> 
<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<scope>provided</scope>
			<version>2.0</version>
</dependency>

<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.2</version>
			<scope>compile</scope>
</dependency>
<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.2.2</version>
			<scope>compile</scope>
</dependency>



Zum Problem:
Auf der Seite localhost:8080/my-aktion/aktionList.xhtml ist kein Element aus der erstellten Liste zu sehen und bei Klick auf "Aktion hinzufuegen" wird eine Exception geworfen:

Code:
javax.faces.el.EvaluationException: javax.el.PropertyNotFoundException: /aktionList.xhtml @62,97 action="#{aktionListController.doAddAktion()}": Target Unreachable, identifier 'aktionListController' resolved to null
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:94)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.el.PropertyNotFoundException: /aktionList.xhtml @62,97 action="#{aktionListController.doAddAktion()}": Target Unreachable, identifier 'aktionListController' resolved to null
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:107)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
	... 24 more


Ich habe schon viel bei Google gesucht und immer nur gefunden, dass die Beans benannt werden sollen und Java 1.7 verwendet werden soll, was ich ja beides gemacht habe, aber es kommt trotzdem der Fehler :(
Weiß jemand Rat?
 
Zuletzt bearbeitet:

stg

Top Contributor
Ich bin ein bisschen raus aus dem Thema und weiß daher nicht genau, ob das wirklich die Ursache des Problems ist, aber auf den ersten Blick sieht es für mich so aus, als würdest du EJB, CDI und ManagedBeans wahllos durcheinanderschmeißen.
Zu dem Thema kannst du z.B. hier mal nachlesen: Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean - Stack Overflow
Außerdem scheint mir, dass du eine veraltete Servelt-API benutzt. Die Übergabe von Argumenten in der EL funktioniert erst ab servlet 3.0 / JEE6. Ob die von dir angegebene dependency aber was damit zu tun, kann ich dir aus oben genanntem Grund auch nicht mit Sicherheit sagen. Aber vielleicht helfen dir die Hinweise ja, eine Lösung deines Problems zu finden
 

Fabulus

Mitglied
Also ich habe mich mal weiter umgeschaut und diese Dependency eingebaut:
Code:
<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>6.0</version>
			<scope>provided</scope>
</dependency>

In diesem sind die JSF-, JSP-, EJB und die Servlet 3.0-API enthalten, jedoch konnte ich es immernoch nicht auf dem Tomcat richtig anzeigen.
Achja: ich hatte vorgehabt, CDI zu verwenden, so steht es auch im Buch mit "Named".

Ich habe jetzt schnell den glassfish installiert und dort funktionierts sofort, es lag also am Tomcat. Wo genau, weiß ich aber nicht, falls das Problem noch mehr Leute irgendwann mal haben sollten :)
 
F

fisherman

Gast
Die Übergabe von Argumenten ist in der EL Spec geregelt. Das geht erst ab EL 2.2. Glassfish unterstützt die Spec, Tomcat nicht. D.h. für den Tomcat benötigt man eine entsprechende zusätzliche Bibliothek. Z.B. so:

[XML]
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
[/XML]
 

Ähnliche Java Themen

Neue Themen


Oben