Запуск ManagedBean при запуске

Я делаю проект с JSF и хочу заполнить свою базу данных при запуске (например, начальный файл в Rails), я искал этот форум, но ответы мне не помогли, вот код:

Семя базы данных.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("[email protected]");
        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>

Но когда я запускаю приложение, в БД ничего не вставляется.


person Alessio Rossotti    schedule 06.01.2015    source источник


Ответы (1)


Есть 2 ошибки:

  • Вы объявили управляемый компонент с помощью аннотации и конфигурации XML. Когда управляемый компонент объявляется обоими способами, способ XML имеет приоритет. Вы не установили eager=true в XML, поэтому он больше не инициализируется.

    Просто избавьтесь от <managed-bean> в faces-config.xml. Это устаревший способ JSF 1.x, который не нужен в JSF 2.x.

  • Вы использовали область управляемого компонента CDI @javax.enterprise.context.ApplicationScoped в управляемом компоненте JSF @ManagedBean. Это не сработает. Вам необходимо объявить область действия управляемого компонента JSF, иначе по умолчанию она будет равна @RequestScoped.

    Заменять

    import javax.enterprise.context.ApplicationScoped;
    

    by

    import javax.faces.bean.ApplicationScoped;
    

Не связанный с конкретной проблемой, если компонент нигде не используется ни в одном артефакте JSF, вместо этого лучше использовать @Singleton @Startup EJB. Более того, наличие @PersistenceContext в управляемом компоненте JSF — это запах дизайна.

person BalusC    schedule 06.01.2015