Java ExceptionInitializationError в статическом блоке - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь вызвать метод получения URL-адреса внутри статического блока, не удалось создать экземпляр компонента; вложенное исключение - java.lang.ExceptionInInitializerError.

Я пытаюсь получить URL WSDL из файла конфигурации. эти данные конфигурации хранятся в БД.

static 
{
    URL url = null;
    WebServiceException e = null;
    try 
{
    url = getVertexConfiguration();
    } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
    }

private static URL getVertexConfiguration() throws MalformedURLException
    {
        try {
            configuration = configurationDAO.getByRefName("tax/vertex",
                    SecureSession.getUser().getDataDomain() != null ?
                            SecureSession.getUser().getDataDomain() : "app.cantata");
        } catch (B2BTransactionFailed b2BTransactionFailed) {

        }

        Map<String, DynamicAttribute> vertexTaxConfig = configuration.getConfigs();
        vertexWsdlUrl = vertexTaxConfig.get("vertexWsdlUrl").getValue().toString();

        return new URL(vertexWsdlUrl);
    }

}

Я получаю статический блок, завершение бина не удалось; Вложенным исключением является java.lang.ExceptionInInitializerError.

Ответы [ 4 ]

0 голосов
/ 30 мая 2019

Это исключение представляет собой механизм ретрансляции для ошибки, возникшей при запуске статического инициализатора.Исключение должно иметь причину, которая будет описывать фактическую ошибку.Согласно вашему описанию выше, существует три уровня исключения: сообщение об ошибке при инициализации компонента, исключение ExceptionInInitializer, затем причина исключения ExceptionInInitializer.Обработка исключений должна отображать все три слоя, но может и не отображать, что усложнит раскрытие базового исключения.

Из ExceptionInInitializer javaDoc:

 * Signals that an unexpected exception has occurred in a static initializer.
 * An <code>ExceptionInInitializerError</code> is thrown to indicate that an
 * exception occurred during evaluation of a static initializer or the
 * initializer for a static variable.

Asв качестве запасного варианта вы можете поместить в getVertexConfiguration try-catch на Throwable, и блок catch распечатает стек:

private static URL getVertexConfiguration() throws MalformedURLException {
    try {
        // Code omitted
    } catch ( Throwable th ) {
        th.printStackTrace();
        return null;
    }
}
0 голосов
/ 30 мая 2019

Вы получаете ExceptioninInitializerBlock, если в блоке статического инициализатора есть ошибки.Вы обрабатываете только MalformedURLException, однако могут быть и другие.

Вы должны добавить еще catch для всех исключений и посмотреть, что там происходит.

static {
    URL url = null;
    WebServiceException e = null;
    try {
        url = getVertexConfiguration();
    } catch (MalformedURLException ex) {
        e = new WebServiceException(ex);
    } catch (Exception e) {
        //real problem
    }
}
0 голосов
/ 30 мая 2019

Основной причиной является то, что статический блок является самым ранним этапом при настройке в качестве инициализации на уровне класса, которая даже предшествует вызову конструктора. То есть ваша зависимость в статическом блоке, такая как configurationDAO, еще не инициализирована. Вы не должны использовать статические для этого. Вместо этого вы должны сделать это обычным методом экземпляра.

0 голосов
/ 30 мая 2019

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

Как мы уже обсуждали в комментариях, я определенно рекомендую вам, автор, правильно ввести ваши зависимости, например:

@Service
public class ConfigurationService {

    private final ConfigurationDao configurationDao;
    private URL url;

    public ConfigurationService(ConfigurationDao configurationDao) {
        this.configurationDao = configurationDao;
    }

    @PostConstruct
    private void init() {
        // your stuff here
    }
}

Или вы можете даже инициализировать ваш url в конструкторе:

@Service
public class ConfigurationService {

    private final ConfigurationDao configurationDao;
    private final URL url;

    public ConfigurationService(ConfigurationDao configurationDao) {
        this.configurationDao = configurationDao;
        this.url = getVertexConfiguration();
    }

    private URL getVertexConfiguration() {
        // your stuff here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...