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



## jee6learner (29. Mrz 2011)

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>

            <hanelGrid 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"/>

            </hanelGrid>

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

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


*User.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*

```
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 (29. Mrz 2011)

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 (29. Mrz 2011)

danke, ein versuch wars wert 

@SessionScoped ist in der Tat auch in einem anderen Paket enthalten. NetBeans schlägt 
	
	
	
	





```
javax.faces.bean.SessionScoped
```
 und 
	
	
	
	





```
javax.enterprise.context.SessionScoped
```
 vor, aber wie Du meinem Quelltext in der Datei 
	
	
	
	





```
User.java
```
 entnehmen kannst, verwende ich 
	
	
	
	





```
javax.enterprise.context.SessionScoped
```
. entgegen dem tutorial, das ich durcharbeite, habe ich auch die 
	
	
	
	





```
javax.faces.bean.SessionScoped
```
-Variante probiert - leider gleiches Ergebnis.

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


----------



## mvitz (29. Mrz 2011)

Hast du denn eine beans.xml unter WEB-INF bzw. WEB-INF/classes/META-INF liegen?

Configuring a CDI Application - The Java EE 6 Tutorial


----------



## jee6learner (30. Mrz 2011)

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 
	
	
	
	





```
WEB-INF
```
 sollte eine (ggfs. auch komplett leere) 
	
	
	
	





```
beans.xml
```
 enthalten.


----------



## Mr.y (12. Sep 2013)

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:


```
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>
		<hutputLabel value="Username: " style="font-weight:bold" />
		<h:inputText id="currentCustomer"  value="#{storeBean.customerName}"></h:inputText>
		<hutputLabel 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
> ...



Bitte um Hilfe!!!!
Danke


----------

