Избегание javax.el.PropertyNotFoundException для поиска пакетов ресурсов в jsf 2.1 + spring 3 - PullRequest
1 голос
/ 28 марта 2012

Мы определили свойства в нескольких пакетах ресурсов, которые настроены в файле face-config.xml

<resource-bundle>
<base-name>webMessages</base-name>
<var>feBundle</var>
</resource-bundle>

Затем мы пытаемся получить доступ к свойству, которое не определено.

<tag infoText="#{feBundle['insurance.comparison.household.details.aicraftCrash.tooltip']}"

/>

Если свойство недоступно, генерируется исключение javax.el.PropertyNotFoundException, которое приводит к тому, что сервлет лица отображает пустую страницу. Из документации ResourceBundleELResolver этого не должно происходить, так как он не выдает это исключение. Я вижу, что это часть распознавателей DemuxCompositeELResolver. Но, похоже, он никогда не вызывается. Вместо этого вызывается MapELResolver (который ставится после RBELResolver в списке распознавателей) и выдает исключение. Я не могу сделать что-то такое поведение, и отладка утомительна. Должен быть какой-то способ обойти это. Отсутствующее свойство не может нарушить весь процесс рендеринга страницы. Есть идеи?

Примечание: это проблема только с библиотекой javax.el, которая поставляется с tomcat> 6 дистрибутивов

1 Ответ

2 голосов
/ 29 марта 2012

Я изучил проблему немного подробнее и обнаружил, что она вызвана реализацией пакета javax.el в дистрибутиве tomcat.Таким образом, описанное поведение происходит только при использовании tomcat> 6. Я уже подал отчет об ошибке в их инструмент отслеживания ошибок, хотя можно утверждать, что это не настоящая ошибка, а своего рода желаемое (но, ИМХО, уродливое) поведение.Я также нашел решение для jsf.

Подкласс ResourceBundleELResolver и переопределить его метод getValue (...).Измените его таким образом, чтобы он устанавливал атрибут PropertyResolved в значение true, прежде чем возникнет какое-либо исключение.

 if (base instanceof ResourceBundle) {
        if (property != null) {
            try {
                context.setPropertyResolved(true);
                Object result = ((ResourceBundle) base).getObject(property
                        .toString());
                return result;
            } catch (MissingResourceException mre) {
                System.out.println("Missing property: " + property);
                return "?" + property.toString() + "?";
            }
        }
    }

Зарегистрируйте этот пользовательский преобразователь в face-config.xml с помощью

<el-resolver>your.package.TheResolverImplementation</el-resolver>

и ссылкойк сообщению об ошибке https://issues.apache.org/bugzilla/show_bug.cgi?id=53001

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...