在启动时运行ManagedBean

时间:2015-01-06 15:42:59

标签: jsf managed-bean

我正在用JSF做一个项目,我想在启动时填充我的数据库(就像Rails中的种子文件一样),我搜索了这个论坛,但答案对我没有用,这里是代码:

DatabaseSeed.java:

package it.polimi.meteocal.business.control;

import it.polimi.meteocal.business.entity.User;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@ApplicationScoped
@ManagedBean(eager=true)
public class DatabaseSeed {

    @PersistenceContext
    EntityManager em;

    private User user;

    /**
     *  Initialize database values
     */
    @PostConstruct
    public void init(){

        user.setIdUser(1);
        user.setEmail("provaprova@gmail.com");
        user.setGroupname("USERS");
        user.setName("Provaseed");
        user.setSurname("Provaseed");
        user.setPassword("prova");
        user.setUsername("prova");

        em.persist(user);
    }

}

并在faces-config.xml中:

<managed-bean> 
  <managed-bean-name>DatabaseSeed</managed-bean-name> 
  <managed-bean-class>it.polimi.meteocal.business.control</managed-bean-class> 
  <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

但是当我运行应用程序时,没有任何内容插入到db

1 个答案:

答案 0 :(得分:2)

有两个错误:

  • 您通过注释和XML配置声明了托管bean。当双向声明托管bean时,XML方式优先。您没有在XML中设置eager=true,因此不再急切地初始化。

    <managed-bean>中摆脱faces-config.xml。这是JSF 2.x中不需要的传统JSF 1.x方式。

  • 您在JSF托管bean @javax.enterprise.context.ApplicationScoped上使用了CDI托管bean范围@ManagedBean。这不会奏效。您需要声明一个JSF托管bean作用域,否则它将默认为@RequestScoped

    替换

    import javax.enterprise.context.ApplicationScoped;
    

    通过

    import javax.faces.bean.ApplicationScoped;
    

无关具体问题,如果bean在任何JSF工件中都没有使用过,那么你最好使用@Singleton @Startup EJB。此外,在JSF托管bean中使用@PersistenceContext是一种设计气味。