我正在用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
中答案 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
是一种设计气味。