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

StackOverflow https://stackoverflow.com/questions/4606568

  •  25-09-2019
  •  | 
  •  

Вопрос

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

Я в точке, чтобы успокоиться сейчас. Я пытался сделать это с механизмом @applationscoped:

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

Это возможно? Я попробовал, но менеджер, кажется, не называться ..

Можете ли вы совет лучшей практикой?


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

@ Balusc's Pot: я создал общениебен:

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

    public static FrontendCommInterface server;

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

Тогда я создал боевик:

@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, будет создать это -.-

Это было полезно?

Решение

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

В вашем конкретном случае вы фактически хотите использовать некоторые вещи во время запуска WebApp. Вы скорее хотите использовать 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.
    }

}

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

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

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

Другие советы

Если вы можете использовать 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 и предоставляется серверами веб-профиля, как Стеклянная рыба, Jboss 6., а также Смола. Отказ При использовании такого сервера веб-сайта вы просто включаете свои EJBS в свой файл .war, ни одна дополнительная работа не требуется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top