JSF@managedproperty和@PostConstruct

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>

我对JSF2@ManagedProperty注释有问题。我有一个创建用户的托管bean,然后我想将该用户传递给另一个bean,以显示与该用户相关的其他信息。因此,我的代码如下:

@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>