@ManagedProperty не работает в управляемом компоненте CDI
Я пытаюсь изучить JSF и столкнулся с проблемой, связанной с ManagedProperty. Однако я пытался использовать его, он всегда терпел неудачу - нулевой указатель исключения. Что я делаю неправильно? Я прочитал "подобные посты" на stackru, но они мне не помогли. (Я использую GlassFish 4.0, JSF 2.2, JDK 1.7, Netbeans 7.3.1 (пакет Java EE) и Java EE 6.0)
<?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://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<br/>
User: #{books.user.name}<br/>
1: #{param.pageId}<br/>
2: #{books.pageId}<br/>
<h:form>
<h:inputText value="#{user.name}" /><br/>
<h:inputText value="#{books.v1}" /><br/>
<h:inputText value="#{books.v2}" /><br/>
<h:inputText value="#{books.result}" /><br/>
<h:commandButton value="dodaj" action="#{books.add}" />
</h:form>
</h:body>
</html>
Книга
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tpsa.books.managed;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedProperty;
/**
*
* @author tomasz
*/
@Named(value = "books")
@RequestScoped
public class Books {
private int v1;
private int v2;
private int result;
@ManagedProperty(value = "#{user}")
private User user;
@ManagedProperty(value="#{param.pageId}")
private int pageId;
/**
* Creates a new instance of Books
*/
public Books() {
}
public void add() {
result = v1 + v2;
}
public int getV1() {
return v1;
}
public void setV1(int v1) {
this.v1 = v1;
}
public int getV2() {
return v2;
}
public void setV2(int v2) {
this.v2 = v2;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public User getUser() {
if (user == null) {
System.err.println("WTF");
}
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getPageId() {
return pageId;
}
public void setPageId(int pageId) {
this.pageId = pageId;
}
}
пользователь
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tpsa.books.managed;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
/**
*
* @author tomasz
*/
@Named(value = "user")
@SessionScoped
public class User implements Serializable {
private String name;
/**
* Creates a new instance of User
*/
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1 ответ
@ManagedProperty
это управляемый bean annotaion, который нельзя использовать с CDI. В приведенном выше коде вы использовали компонент CDI, т.е. @Named
это по умолчанию в JSF 2.2. В этом случае вы не можете использовать ManagedProperty. Пожалуйста, прочитайте следующую строку, скопированную из документации Java EE ManagedBean.
Если эта аннотация присутствует в классе, который не имеет аннотации ManagedBean, реализация не должна предпринимать никаких действий для этой аннотации.
Подробности смотрите по ссылке:
http://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedProperty.html
Итак, используйте @Inject
вместо @ManagedProperty
для бобов CDI.
@Inject
private User user;
Обратите внимание, что геттер / сеттер здесь не нужен.