JSF/CDI - Target Unreachable, identifier 'user' resolved to null

jee6learner

Mitglied
ein anfänger-problem mit jsf2 und cdi... folgendes problem: vier dateien (index.xhtml, User.java, DateUtil.java, response.xhtml). die kombination der dateien passt auch soweit und ich erhalte das, was ich möchte, wenn ich nun das @ManagedBean durch @Named ersetze, dann bekomme ich den fehler
/index.xhtml @18,82 value="#{user.name}": Target Unreachable, identifier 'user' resolved to null

habe gelesen, dass @Named neuer (seit JSF2?) ist und ich frage mich, was der Fehler sein kann... wie gesagt, wenn ich in User.java und DateUtil.java statt @ManagedBean ein @Named einsetze, wird obiger Fehler angezeigt. Das User ist ja aber bekannt und auch NetBeans erkennt den Querverweis durch Links zur entsprechenden User-Klasse. woran kanns also liegen?

index.xhtml
[XML]<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Validierung</title>
</h:head>
<h:body>
<h:form>

<h:panelGrid columns="3">

<!-- name -->
Wie heißen Sie?
<h:inputText id="name" value="#{user.name}"
required="true"
requiredMessage="Bitte geben Sie Ihren Namen ein."/>
<h:message for="name" style="color:red"/>

<!-- year of birth -->
Ihr Geburtsjahr?
<h:inputText id="yob" value="#{user.yearOfBirth}"
required="true"
requiredMessage="Bitte geben Sie Ihr Geburtsjahr ein."
converterMessage="Bitte eine Zahl von #{dateUtil.minimumBirthYear} bis #{dateUtil.currentYear} eingeben."
validatorMessage="Bitte geben Sie Ihr tatsächliches Geburtsjahr an." >
<f:validateLongRange minimum="#{dateUtil.minimumBirthYear}" maximum="#{dateUtil.currentYear}"/>
</h:inputText>
<h:message for="yob" style="color:red"/>

</h:panelGrid>

<h:commandButton action="response" value="Und los!"/>

</h:form>
</h:body>
</html>[/XML]


User.java
Java:
package de.jee6.test.greetingvalidation;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.inject.Inject;
import javax.inject.Named;


//@Named
//@SessionScoped
@ManagedBean
public class User {

    @Inject DateUtil dateUtil;

    private String name;
    private Integer yearOfBirth;

    public String getName() {
        return name;
    }

    public Integer getYearOfBirth() {
        return yearOfBirth;
    }

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

    public void setYearOfBirth(Integer yearOfBirth) {
        this.yearOfBirth = yearOfBirth;
    }

    public int getAge() {
        Logger.getAnonymousLogger().log(Level.WARNING, "getAge()" + dateUtil);
        //return dateUtil.getCurrentYear() - yearOfBirth;
        return 2011 - yearOfBirth;
    }

}

DateUtil.java
Java:
package de.jee6.test.greetingvalidation;

import java.io.Serializable;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.inject.Named;

//@Named
@ManagedBean
public class DateUtil implements Serializable {

    public int getMinimumBirthYear() {
        return 1800;
    }

    public int getCurrentYear() {
        Logger.getLogger(DateUtil.class.getName()).log(Level.INFO,
                "### DateUtil.getCurrentYear");
        return Calendar.getInstance().get(Calendar.YEAR);
    }

}

response.xhtml
[XML]<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html">
<h:head>
<title>Validierung</title>
</h:head>
<h:body>
<h1>Hallo #{userFoo.name}!</h1>
<h2>Dann sind Sie wohl etwa #{user.age} Jahre alt.</h2>
</h:body>
</html>[/XML]
 

mvitz

Top Contributor
Wenn mich nicht alles täuscht, gibt es @SessionScoped in mehreren Paketen.

Evtl. hast du hier einfach das falsche importiert. Richtig ist das Paket, welches nichts mit JSF zu tun hat.
 

jee6learner

Mitglied
danke, ein versuch wars wert :)

@SessionScoped ist in der Tat auch in einem anderen Paket enthalten. NetBeans schlägt
Code:
javax.faces.bean.SessionScoped
und
Code:
javax.enterprise.context.SessionScoped
vor, aber wie Du meinem Quelltext in der Datei
Code:
User.java
entnehmen kannst, verwende ich
Code:
javax.enterprise.context.SessionScoped
. entgegen dem tutorial, das ich durcharbeite, habe ich auch die
Code:
javax.faces.bean.SessionScoped
-Variante probiert - leider gleiches Ergebnis.

deshalb bin ich dankbar für weitere vorschläge.
 
Zuletzt bearbeitet:

jee6learner

Mitglied
funktioniert - danke :)!

anmerkung: die von dir genannte fehlerbehebung hatte ich einmal getestet, dann aber einen build-error erhalten und es wieder verworfen. letztlich stellte es sich aber doch als korrekt heraus, da ein weiterer fehler zum build-error geführt hatte, den ich aber auch beheben konnte.

also: antwort auf die frage, korrekt vom vorredner:
das verzeichnis
Code:
WEB-INF
sollte eine (ggfs. auch komplett leere)
Code:
beans.xml
enthalten.
 

Mr.y

Aktives Mitglied
Hi,

ich habe zur Zeit das selbe Problem und leider bringt mir "beans.xml" nix.

Ich benutze "Maven" mit folgender pom.xml:

[XML]<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.blr.store</groupId>
<artifactId>store</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>store Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>

<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.7</version>
</dependency>

<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.0-CR1</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>

<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<!-- Tomcat 6 need this -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>


<dependency>
<groupId>javax.ejb</groupId>
<artifactId>ejb-api</artifactId>
<version>3.0</version>
</dependency>


<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>

<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>

</dependencies>

<build>
<finalName>JavaServerFaces</finalName>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>

</build>


<repositories>
<repository>
<id>appfuse-releases</id>
<name>AppFuse Releases</name>
<url>https://oss.sonatype.org/content/repositories/appfuse-releases</url>
</repository>
</repositories>


</project>[/XML]

meine Java-Klasse:

Java:
import java.util.List;

import javax.faces.application.FacesMessage;
//import javax.faces.bean.SessionScoped;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;
import javax.annotation.PostConstruct;

import com.sun.faces.spi.FacesConfigResourceProvider;

import de.blr.businesslogic.*; 
import de.blr.model.*;



@Named("storeBean")
@SessionScoped
public class ServicePM {

	@EJB
	private StoreService storeService;

	
	private Customer customer;
	private Article article;
	private List<Article> articles;

	@PostConstruct
	private void init() {

		customer = storeService.getCustomer();
		articles = storeService.getArticle();

	}

	private String customerName;
	private String customerPW;

	// Alle Methoden, die man auf der Oberfläche von JSF als Kunde aufrufen kann
	// "zurKusse", ArticelSuchen....

	public String getCustomerName() {
		return customerName;
	}

	public void setCustomerName(String customerName) {
		this.customerName = customerName;
		System.out.println("eingegebener Name: " + this.customerName);
	}

	public String getCustomerPW() {
		return customerPW;
	}

	public void setCustomerPW(String customerPW) {
		this.customerPW = customerPW;
		System.out.println("eingegebenes PW: " + this.customerPW);
	}

	public Article searchedArticle(Article article) {

		article = storeService.ArticleSearch();
		return article;
	}
}

und jsf:
[XML]
<h:body>
<h:form>
<h:eek:utputLabel value="Username: " style="font-weight:bold" />
<h:inputText id="currentCustomer" value="#{storeBean.customerName}"></h:inputText>
<h:eek:utputLabel value="Password: " style="font-weight:bold" />
<h:inputSecret id="password" value="#{storeBean.customerPW}"></h:inputSecret>
<h:commandButton value="Login" action="#{servicePM.logIn}"></h:commandButton>
</h:form>
</h:body>[/XML]

In Zeile 4, wo ich den java-Setter anspreche, kommt diese Fehlermeldung.

Ich habe noch ein Problem mit den Abhängigkeiten in der Pom.xml, wobei das glaub ich erstmal keine ausschlaggebende Rolle auf den Zugriff auf die @Named- Klasse hat:

Missing artifact org.glassfish.web:el-impl:jar:2.2
Missing artifact javax.el:el-api:jar:2.2
Missing artifact javax.servlet:servlet-api:jar:2.5
Missing artifact javax.servlet.jsp:jsp-api:jar:2.1
Missing artifact javax.inject:javax.inject:jar:1
Missing artifact javax.ejb:ejb-api:jar:3.0
Missing artifact org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final
ArtifactDescriptorException: Failed to read artifact descriptor for javax.inject:javax.inject:jar:1.0-PFD-1: ArtifactResolutionException: Could not transfer artifact javax.inject:javax.inject:pom:1.0-PFD-1 from/to repository.jboss.org (http://repository.jboss.org/maven2): Access denied to http://repository.jboss.org/maven2/javax/inject/javax.inject/1.0-PFD-1/javax.inject-1.0-PFD-1.pom. Error code 403, Forbidden pom.xml /store line 1 Maven Dependency Problem
Missing artifact javax.enterprise:cdi-api:jar:1.0-CR1 pom.xml /store line 1 Maven Dependency Problem
Missing artifact javax.servlet:jstl:jar:1.2 pom.xml /store line 1 Maven Dependency Problem
Missing artifact com.sun.faces:jsf-api:jar:2.1.7 pom.xml /store line 1 Maven Dependency Problem
Missing artifact com.sun.faces:jsf-impl:jar:2.1.7 pom.xml /store line 1 Maven Dependency Problem

Bitte um Hilfe!!!!
Danke
 
Zuletzt bearbeitet:
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben