JSF@managedproperty和@PostConstruct
我对JSF2@ManagedProperty注释有问题。我有一个创建用户的托管bean,然后我想将该用户传递给另一个bean,以显示与该用户相关的其他信息。因此,我的代码如下:JSF@managedproperty和@PostConstruct,jsf,netbeans,postconstruct,managed-property,Jsf,Netbeans,Postconstruct,Managed Property,我对JSF2@ManagedProperty注释有问题。我有一个创建用户的托管bean,然后我想将该用户传递给另一个bean,以显示与该用户相关的其他信息。因此,我的代码如下: @Named("userController") @SessionScoped public class UserController implements Serializable { @EJB private session.UserFacade ejbFacade; private List<User>
@Named("userController")
@SessionScoped
public class UserController implements Serializable {
@EJB
private session.UserFacade ejbFacade;
private List<User> items = null;
private User selected;
private User utente;
private String user;
private String pass;
----getter and setter----
我控制用户存在并设置Utene的代码顺序是:
@Stateless
public class UserFacade extends AbstractFacade<User> {
@PersistenceContext(unitName = "ImmobiliareWebPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public UserFacade() {
super(User.class);
}
public boolean logValid(String user, String pass) {
List<User> utente ;
boolean autorizzato;
String find = "User.findByUsername&Password";
Query query = em.createNamedQuery(find, User.class);
query.setParameter("username", user);
query.setParameter("password", pass);
utente =query.getResultList();
if (utente.isEmpty()) {
autorizzato=false;
}
else{
autorizzato=true;
}
return autorizzato;
}
public User setUtente(String user) {
//SETTO L'UTENTE PER LA SESSIONE DEL PROGRAMMA
User utente;
String find = "User.findByUsername";
Query query = em.createNamedQuery(find, User.class);
query.setParameter("username", user);
utente =(User) query.getSingleResult();
return utente;
}
@无状态
公共类UserFacade扩展了AbstractFacade{
@PersistenceContext(unitName=“ImmobiliareWebPU”)
私人实体管理者;
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
公共UserFacade(){
super(User.class);
}
公共布尔值logValid(字符串用户,字符串传递){
上尉名单;
布尔自调整;
String find=“User.findByUsername&Password”;
Query Query=em.createNamedQuery(find,User.class);
query.setParameter(“用户名”,用户);
query.setParameter(“密码”,pass);
utinte=query.getResultList();
if(unte.isEmpty()){
autorizzato=假;
}
否则{
autorizzato=真;
}
返回autorizzato;
}
公共用户setuteName(字符串用户){
//设置为每个程序的会话
用户助理;
String find=“User.findByUsername”;
Query Query=em.createNamedQuery(find,User.class);
query.setParameter(“用户名”,用户);
utente=(用户)query.getSingleResult();
返回中尉;
}
}
我需要用户信息的代码是:
@Named(value = "scheduleController")
@RequestScoped
public class ScheduleController implements Serializable {
private ScheduleModel eventModel;
private ScheduleEvent event = new DefaultScheduleEvent();
@EJB
ActivityFacade ejbFacade;
@Inject
private UserController credentials;
public ScheduleController() {
}
@PostConstruct
public void init(){
eventModel = new DefaultScheduleModel();
List<Activity> daFare =ejbFacade.findForUser(credentials.getUtente().getIdUser());
for(int i=0;i<daFare.size();i++){
eventModel.addEvent(new DefaultScheduleEvent(daFare.get(i).getDescrizione(),daFare.get(i).getDalleOre(),daFare.get(i).getAlleOre() ));
}
}
@Named(value=“scheduleController”)
@请求范围
公共类ScheduleController实现可序列化{
私有调度模型事件模型;
private ScheduleEvent事件=新的DefaultScheduleEvent();
@EJB
活动门面ejbFacade;
@注入
私有用户控制器凭据;
公共ScheduleController(){
}
@施工后
公共void init(){
eventModel=新的DefaultScheduleModel();
List daFare=ejbFacade.findForUser(credentials.getute().getIdUser());
对于(int i=0;i
调试代码时,我看到UserController凭据是
总是空的…怎么了
请注意,您与托管属性混淆,这可能导致所描述的行为。您的bean使用@Named
而不是@ManagedBean
进行注释,因此:
@ManagedProperty(value="#{userController}")
private UserController credentials;
应替换为以下内容:
@Inject
private UserController credentials;
有关CDI和支持bean之间差异的非常好的解释,请参阅本主题中的@BalusC answer:
我需要在faces-config.xml中指定一些内容
不,但您应该包括一个beans.xml
,如此处所示:。据我所知,无论是何种发现模式,此文件都是必需的。以下是您可以在NetBeans中自动生成的beans.xml
:
新文件-->上下文和依赖项注入-->beans.xml(CDI配置文件)
这就是使CDI工作所需的全部:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
</beans>
谢谢您的回答。现在我知道Named和ManagedBean之间存在差异。但问题仍然存在!现在,在用Inject替换ManagedProperties并创建一个空白的beans.xml文件后,调试代码时,我看到包含injected UserController的变量都有空字段。我应该更改哪些内容?这似乎是UserController的一个新实例,不是我说的第一个。再次感谢您的回复。好消息是注入正在工作。请注意,您不必显式地不稳定任何内容,因为这两个bean都是管理的。如果UserController
看起来像一个新实例,是因为容器没有创建新实例之前的实例(因为不需要)。如果不知道应用程序中的流程,很难给你一个具体的答案。也许你可以在调用bean的过程中发布序列,而不仅仅是它们的定义。@ClaudioCerinoI已经用代码序列编辑了这个问题。我希望你能给我一些启发。再次感谢@DIC19,如果你调试utente=ejbFacade.setUtente(用户)
line,是否setute
不为空?我想说方法setute(…)
的名称可能是错误的(您正在尝试从EJB获取实体)或者,给定您的代码,这不是合适的方法。utente不为null。它具有所有正确的字段值。从DB表中获取实体的正确方法是什么?我认为从EJB facade获取它是最好的方法……我在@DIC19上添加了代码序列。这种方法是正确的,但我将setUtente(…)
重命名为getUtenePernome(…)
因为该方法实际上就是这样做的。代码中的所有内容看起来都很好,应该可以正常工作,我看不出任何奇怪的地方。请注意,beans.xml
中缺少一个
标记,但我认为这只是一个复制粘贴问题。我按照您的建议重命名了该方法。但是该应用程序不工作。有什么需要我确认的吗我是在glassfish还是在Netbeans中?我必须将beans.xml文件放在哪里?我已经将其放在WEB-INF文件夹中,对吗?后结构是否有问题?请查看我的beans.xml示例。您可以在Netbeans中自动生成此文件。
@Named(value = "scheduleController")
@RequestScoped
public class ScheduleController implements Serializable {
private ScheduleModel eventModel;
private ScheduleEvent event = new DefaultScheduleEvent();
@EJB
ActivityFacade ejbFacade;
@Inject
private UserController credentials;
public ScheduleController() {
}
@PostConstruct
public void init(){
eventModel = new DefaultScheduleModel();
List<Activity> daFare =ejbFacade.findForUser(credentials.getUtente().getIdUser());
for(int i=0;i<daFare.size();i++){
eventModel.addEvent(new DefaultScheduleEvent(daFare.get(i).getDescrizione(),daFare.get(i).getDalleOre(),daFare.get(i).getAlleOre() ));
}
}
@Stateless
public class ActivityFacade extends AbstractFacade<Activity> {
@PersistenceContext(unitName = "ImmobiliareWebPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public ActivityFacade() {
super(Activity.class);
}
public List<Activity> findForUser(int utenteId) {
//RICHIEDO LE ATTIVITA' DEL SINGOLO UTENTE
List<Activity> daFare ;
String find = "Activity.findByUserId";
Query query = em.createNamedQuery(find, Activity.class);
query.setParameter("idUser", utenteId);
daFare =query.getResultList();
return daFare;
}
}
@ManagedProperty(value="#{userController}")
private UserController credentials;
@Inject
private UserController credentials;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="annotated">
</beans>