在 ManagedBean 的 @PostConstruct 中设置 属性 的可见性
visibility of property set in @PostConstruct in ManagedBean
我正在尝试在@PostConstruct 中设置的@RequestScoped Bean 中获取属性 值。我有 editUser 页面 从其他页面获取 userId,并且我在 @PostConstruct 中从数据库获取用户,但是当我尝试在同一页面中编辑该用户时,用户对象为 null,在方法 editUser 中。
有没有办法获取在 PostConstruct 中设置的那个对象?
这是我的 EditUserBean:
package ba.nedim.colaborationtoolapp.model;
import ba.nedim.colaborationtoolapp.dto.UserDTO;
import ba.nedim.colaborationtoolapp.services.RegisterService;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import org.primefaces.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ManagedBean
@RequestScoped
public class EditUserBean implements Serializable{
@EJB
private RegisterService userService;
private final Logger log = LoggerFactory.getLogger(EditUserBean.class);
private int idUser;
@ManagedProperty("#{param.id}")
private int actionId;
public int getActionId() {
return actionId;
}
public void setActionId(int actionId) {
this.actionId = actionId;
}
private UserDTO user = new UserDTO();
public UserDTO getUser() {
return user;
}
public void setUser(UserDTO user) {
this.user = user;
}
@PostConstruct
private void initialize(){
if(actionId!=0){
setUser(userService.getUserByID(actionId));
}
}
public void editUser(){
UserDTO user = getUser();
log.info("UserID:" + user.getIdusers());
}
private String gotoUserPage(){
return "users";
}
}
页面完全呈现后,@RequestScoped
bean 及其所有实例变量(包括 user
)被销毁。我认为这是您随后尝试执行 editUser()
的点,这会导致 NPE。
改用 @ViewScoped
bean,以确保您的实例变量在回发到同一视图后仍然存在
我正在尝试在@PostConstruct 中设置的@RequestScoped Bean 中获取属性 值。我有 editUser 页面 从其他页面获取 userId,并且我在 @PostConstruct 中从数据库获取用户,但是当我尝试在同一页面中编辑该用户时,用户对象为 null,在方法 editUser 中。 有没有办法获取在 PostConstruct 中设置的那个对象?
这是我的 EditUserBean:
package ba.nedim.colaborationtoolapp.model;
import ba.nedim.colaborationtoolapp.dto.UserDTO;
import ba.nedim.colaborationtoolapp.services.RegisterService;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import org.primefaces.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ManagedBean
@RequestScoped
public class EditUserBean implements Serializable{
@EJB
private RegisterService userService;
private final Logger log = LoggerFactory.getLogger(EditUserBean.class);
private int idUser;
@ManagedProperty("#{param.id}")
private int actionId;
public int getActionId() {
return actionId;
}
public void setActionId(int actionId) {
this.actionId = actionId;
}
private UserDTO user = new UserDTO();
public UserDTO getUser() {
return user;
}
public void setUser(UserDTO user) {
this.user = user;
}
@PostConstruct
private void initialize(){
if(actionId!=0){
setUser(userService.getUserByID(actionId));
}
}
public void editUser(){
UserDTO user = getUser();
log.info("UserID:" + user.getIdusers());
}
private String gotoUserPage(){
return "users";
}
}
页面完全呈现后,@RequestScoped
bean 及其所有实例变量(包括 user
)被销毁。我认为这是您随后尝试执行 editUser()
的点,这会导致 NPE。
改用 @ViewScoped
bean,以确保您的实例变量在回发到同一视图后仍然存在