JSF2: как инициировать службы при развертывании

Для университетского проекта я разрабатываю веб-приложение с JSF. Мое упражнение заключается в том, чтобы сделать интерфейс. Однокурсник должен заниматься бэкендом. Обе части предназначены для просмотра приложений. Оба общаются через RMI. Я хочу открыть соединение один раз при развертывании.

Сейчас я наладил связь. Я попытался сделать это с помощью @ApplicationScoped ManagedBean:

//Constructor of ApplicationScoped ManagedBean  
public Communication() {
    this.connect();
}

Возможен ли такой путь? Я пробовал, но, похоже, не вызывается manageBean.

Можете ли вы посоветовать передовую практику?


@Brian: К сожалению, я вообще не использую EJB -.-

Горшок @BalusC: я создал коммуникационный компонент:

@ManagedBean(name="communication")
@ApplicationScoped
public class Communication {

    public static FrontendCommInterface server;

    public Communication() {
        this.connect();
    }

Затем я создал LoginBean:

@ManagedBean
@ViewScoped
public class Login {

@ManagedProperty(value="#{communication}")
private Communication communicationBean;

public FrontendCommInterface server;

private String username;
private String password;

public Login() {
    server = communicationBean.getConnection();
}

public String login(){
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    String sessionId = session.getId();

    try {
        server.login(getUsername(), getPassword(), sessionId);
        return "start.xhtml";

    } catch (RemoteException e) {
        e.printStackTrace();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Anmeldung nicht erfolgreich: ", getUsername()+", "+getPassword()+", "+sessionId));
        return "login.xhtml";
    }
}

Но, к сожалению, он выдает исключения:

com.sun.faces.mgbean.ManagedBeanCreationException: Klasse org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login can not be instanciated.

java.lang.NullPointerException
    org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.<init>(Login.java:28)

После отладки я обнаружил, что мое ManagedProperty равно Null! Он не создан! Как это сделать? Я думал, что ссылка через manageproperty создаст его -.-


person Sven    schedule 05.01.2011    source источник


Ответы (2)


Управляемый bean-компонент создается автоматически только тогда, когда на него ссылается EL #{managedBeanName}, что может произойти либо путем доступа к представлению «как есть», либо путем внедрения в качестве управляемого свойства другого bean-компонента, либо путем ручного EL-разрешения, например. Application#evaluateExpressionGet().

В вашем конкретном случае вы действительно хотите инициализировать некоторые вещи во время запуска веб-приложения. Для этого лучше использовать ServletContextListener.

@WebListener
public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during webapp's startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during webapp's shutdown.
    }

}

Вы даже можете предварительно создать там управляемый bean-компонент с областью действия приложения, когда это необходимо (если вы хотите иметь доступ к нему из других bean-компонентов с помощью @ManagedProperty).

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("bean", new Bean());
    }

JSF хранит bean-компоненты в области приложения как атрибут ServletContext, и JSF не будет автоматически создавать другой, когда он уже присутствует, поэтому тот же самый, созданный в приведенном выше примере кода, также будет использоваться JSF.

person BalusC    schedule 05.01.2011
comment
попробовал простой способ и поместил туда manageProperty, но это не сработало -.- - person Sven; 09.01.2011
comment
Управляемые свойства устанавливаются после создания bean-компонента, а не до. Вам нужно @PostConstruct, чтобы получить к ним доступ. Замените public Login() на @PostConstruct public void init(). - person BalusC; 09.01.2011

Если вы можете использовать EJB 3.1 lite {1} в своем веб-приложении, вы можете использовать Singleton Session Bean с аннотацией @Startup и методом @PostConstruct. У меня есть один, который выглядит так:

@Singleton
@Startup
public class CachePrimer {

    @PostConstruct
    public void loadOpenRequests() {
         ...
    }
}

{1}: EJB 3.1 lite включен в веб-профиль JavEE 6 и предоставляется серверами веб-профилей, такими как Glassfish, JBoss 6 и Смола. При использовании такого сервера веб-профилей вы просто включаете свои EJB в свой файл .war, никаких дополнительных действий не требуется.

person Brian Leathem    schedule 09.01.2011