Как предотвратить запуск приложения Java EE при сбое Spring DI - PullRequest
5 голосов
/ 15 февраля 2011

(Я не уверен, относится ли этот вопрос к приложениям Java EE в целом или относится к Websphere.)

Когда мы получаем сбой Spring DI в приложениях, которые мы развернули в WebSphere (например, ошибка поиска JNDI), приложение по-прежнему успешно запускается.

[15/02/11 17:21:22:495 GMT] 00000037 ContextLoader E org.springframework.web.context.ContextLoader initWebApplicationContext Context initialization failed
                                 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mybean' defined in
   ...big stack trace...
[15/02/11 17:21:22:526 GMT] 00000037 ApplicationMg A   WSVR0221I: Application started: myapp

Как сделать так, чтобы приложение не запускалось, если во время весенней инициализации возникают исключения?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Проверьте, помогает ли это .Исходя из этого, я предполагаю, что это зависит от сервера приложений, но не уверен.

0 голосов
/ 29 апреля 2011

Должен помочь жизненный цикл Binding контекста Spring с жизненным циклом приложения.

Внутри J2EE-сервера контекст Spring в основном получается через org.springframework.context.access.ContextSingletonBeanFactoryLocator (например, он используется org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor).Выполнение инициализации контекста Spring с нетерпением при запуске приложения должно сделать эту работу.

Это можно сделать особым образом для WebSphere, используя Startup Beans:


@RemoteHome(AppStartUpHome.class)
@Stateless
public class SpringLifecycleBean {
    private static Log logger = LogFactory.getLog(SpringLifecycleBean.class);
    private static BeanFactoryReference bfr;

    public boolean start() throws RemoteException {
        logger.debug("Initializing spring context.");

        try {
            BeanFactoryLocator bfl = ContextSingletonBeanFactoryLocator.getInstance();
            //hardcoded spring context's name (refactor for more complex use cases)
            bfr = bfl.useBeanFactory("appContext");
        } catch (Exception e) {
            logger.error("Spring context startup failed", e);
            return false;
        }

        return true;
    }

    public void stop() throws RemoteException {
        if (bfr != null) {
            logger.debug("Releasing spring context.");
            bfr.release();
        }
    }

}

Добавление модуля webapp с javax.servlet.ServletContextListener, содержащий аналогичный код, также будет работать.

...