首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF @managedproperty和@PostConstruct

JSF @managedproperty和@PostConstruct
EN

Stack Overflow用户
提问于 2014-10-07 16:53:58
回答 1查看 2.5K关注 0票数 2

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

代码语言:javascript
复制
@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----

在调度Bean中,我在@PostConstruct中使用userController bean:

代码语言:javascript
复制
@Named(value = "scheduleController")
@SessionScoped
public class ScheduleController implements Serializable {

private ScheduleModel eventModel;  

private ScheduleEvent event = new DefaultScheduleEvent();

@EJB
ActivityFacade ejbFacade;

@ManagedProperty(value="#{userController}")
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() ));
    }
}

public void setCredentials(UserController credentials) {
    this.credentials = credentials;
}   

在调试代码时,我看到UserController凭据始终为空.怎么了?我需要在faces-config.xml中指定什么?非常感谢你的建议。

编辑:

在用@Inject更改@ManagedProperty并在WEB文件夹中添加下面的beans.xml之后,问题仍然存在。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
   <beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

该应用程序的工作方式如下:用户可以通过这个xhtml页面登录:

代码语言:javascript
复制
<body>
    <h:form>  
        <p:growl id="msgs" showDetail="true" />
        <p:panel header="Inserisci i tuoi dati" style="margin: 0 auto; text-align: center" >
            <h:panelGrid columns="2" cellpadding="5" style="margin: 0 auto; text-align: center">
                <p:outputLabel value="Username"/>
                <p:inputText value="#{userController.user}"  required="true" label="Username"   size="40"/>
                <p:outputLabel value="Password" />
                <p:password  value="#{userController.pass}"  required="true" label="Password" size="40"/>
                <p:commandButton action="#{userController.validateLogin}" value="Login"  update="msgs" ajax="false" style="text-align: center"/>
            </h:panelGrid>
        </p:panel>         
    </h:form>

</body>

提交表单后,userController将验证这个特定用户是否存在于DB表中,然后实例化用户utente ( id、用户名、密码、电子邮件作为字段)。之后,应用程序重定向到home.xhtml,它显示多个用户的信息,并选择由用户id选择的DB表的多个信息。下面是我设置用户utente的代码:

代码语言:javascript
复制
public String validateLogin(){

    String output="home";
    boolean exist=false;
    exist=ejbFacade.logValid(user,pass);
    if(!exist){
        //FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Username o Password errata","Contattare l'amministratore"));             
        return "index";
    }else{
        utente=ejbFacade.setUtente(user);  
        FacesContext context = FacesContext.getCurrentInstance();          
        context.addMessage(null, new FacesMessage("Accesso eseguito con successo.","Bentornato " + user));
        return output;
    }
}

我控制用户存在并设置utente的代码序列是:

代码语言:javascript
复制
@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;
}

}

我需要用户信息的代码是:

代码语言:javascript
复制
@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() ));
    }
}

在ejbFacade中,我做了一个简单的查询:

代码语言:javascript
复制
@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;
}

}

在调试模式中,我看到一个带有所有空字段的UserController状态;它似乎是一个新的UserController状态。我也使用“导入javax.enterprise.context.SessionScoped”。我的错在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-07 17:16:58

在调试代码时,我看到UserController凭据始终为空.怎么了?

请注意,您将上下文和依赖注入与托管属性混为一谈,这可能导致了所描述的行为。您的bean是用@Named而不是@ManagedBean注释的,因此如下所示:

代码语言:javascript
复制
    @ManagedProperty(value="#{userController}")
    private UserController credentials;

应由以下内容取代:

代码语言:javascript
复制
    @Inject
    private UserController credentials;

有关CDI和backing之间区别的一个非常好的解释,请参阅本主题中的@BalusC回答:支持beans (@ManagedBean)或CDI (@Named)?

我需要在faces-config.xml中指定什么?

没有,但是您应该包括一个beans.xml,就像这里的例子:包装CDI应用程序。据我所知,无论发现模式如何,这个文件都是强制性的。下面是您可以在beans.xml中自动生成的NetBeans:

新文件->上下文和依赖项注入-> beans.xml (CDI配置文件)。

这是我唯一需要的使CDI正常工作的东西:

代码语言:javascript
复制
<?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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26241197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档