Могу ли я игнорировать BeanCreationException и вместо этого ввести нуль? - PullRequest
8 голосов
/ 18 января 2012

У нас есть ситуация, когда наша Spring связывает некоторые bean-компоненты, включающие классы ActiveMQ, построенные на Java 6. Наше приложение работает на серверах клиентов, поэтому мы не можем гарантировать, что у них установлена ​​Java 6 или более поздняя версия.Если у них есть Java 5, приложение не может запуститься из-за BeanCreationException s с классами, которые зависят от ActiveMQ (основная причина - UnsupportedClassVersionError).

Так что мой вопрос, есть лилюбой способ игнорировать BeanCreationException и все равно запустить приложение?Я хочу отображать сообщение об ошибке, в котором говорится, что им нужно установить Java 6 или более позднюю версию, но поскольку приложение даже не запускается, у меня никогда не было шанса сделать это.

Я догадываюсь, чтонет никакого способа сделать это, потому что Spring должен быть в состоянии гарантировать, что мое приложение построено должным образом после инициализации, но я подумал, что все равно буду спрашивать.Любые другие предложения о том, как достичь моей конечной цели, также будут полезны и оценены.

Мы используем Spring 3.0.6

Спасибо!

Ответы [ 3 ]

4 голосов
/ 18 января 2012

Если вы можете перейти на Spring 3.1 (стабильный), воспользуйтесь преимуществами конфигурации Java:

@Bean
public SomeBean public someBean() {
    if(isEverythingOkWithJavaVersion()) {
        return new CorrectBean();
    } else {
        return null;
    }
}

или

@Bean
public SomeBean public someBean() {
    try {
        return new CorrectBean();
    } catch(UnsupportedClassVersionError e) {
        log.warn("", e);
        return null;
    }
}

В более старых версиях Spring FactoryBean может использоваться для реализации той же логики. Вместо того, чтобы возвращать null, вы также можете вернуть некоторую фальшивую реализацию, которую вы сможете обнаружить позже, и предупредить пользователя, когда приложение пытается ее использовать.

0 голосов
/ 18 января 2012

Вы можете создать фабричный компонент и позволить ему создать фактический компонент ActiveMQ. Если это не может быть инициализировано, фабрика может вернуть фиктивную / фиктивную реализацию, чтобы все не сломалось. Позже вы можете спросить у фабрики, все ли в порядке.

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-extension-factorybean

0 голосов
/ 18 января 2012

Во-первых, любые метания, которые являются подклассом java.lang.Error, обычно считаются невосстановимыми. Поэтому, хотя их можно поймать, настоятельно не рекомендуется :

Error - это подкласс Throwable, который указывает на серьезные проблемы, которые не должно пытаться решить разумное приложение. Большинство таких ошибок являются ненормальными условиями.

Тем не менее, если все, что вы собираетесь сделать, это отобразить сообщение об ошибке, то вам следует сойти с рук.

Итак, чтобы вернуться к вашему вопросу, я предлагаю создать реализацию интерфейса Spring FactoryBean, который попытался бы загрузить классы ActiveMQ. Если это работает, то он может вернуть соответствующий объект из FactoryBean.getObject. Если произойдет сбой (через перехваченный UnsupportedClassVersionError), он может вернуть либо null, либо какой-либо другой объект, представляющий это условие.

...