Facelets 1.x молча терпит неудачу с неправильными именами файлов/путями

Использование JSF 1.2 с Facelets 1.x поверх сервера портала IBM 6.1

Мы широко используем шаблоны, композицию, декорирование и включение механизмов, которые обеспечивают фаслеты, что является абсолютно фантастическим и позволяет нам экстенсивно модулировать наш html.

Одна «особенность», которая нам не нравится, заключается в том, что если мы делаем ошибку в наших именах файлов или путях при обращении к ним в атрибуте include или src, страница вообще не отображается, просто полностью пустой экран, на котором ничего не записывается в журнал. и никаких исключений. Это может немного затруднить отладку.

Конкретный случай, который вызвал этот вопрос, был тем, когда мы продвигали наше приложение с наших локальных компьютеров Windows на нашу промежуточную тестовую машину Unix. Один из включенных нами фрагментов содержал строчную букву s вместо прописной S в имени, и разработчику, которому было поручено исправить это, потребовалось довольно много времени, чтобы отследить его.

Есть ли способ заставить лицевые панели регистрировать или генерировать исключение, когда он не может найти фрагмент html?


person Steve Atkinson    schedule 21.06.2012    source источник


Ответы (1)


JSF 2.x добавляет к этому FileNotFoundException. У меня сейчас нет игровой среды Facelets 1.x, поэтому я не могу протестировать ее для вас, но теоретически вы должны быть в состоянии поймать ее, внедрив собственный преобразователь ресурсов Facelets от DefaultResourceResolver который проверяет результат null в методе resolveUrl().

Что-то вроде этого:

import com.sun.facelets.impl.DefaultResourceResolver;

public class CustomResourceResolver extends DefaultResourceResolver {

    @Override
    public URL resolveUrl(String resource) {
        URL url = super.resolveUrl(resource);

        if (url == null) {
            throw new FacesException(new FileNotFoundException(resource));
            // Perhaps add a logging statement instead if this exception
            // is after all actually completely swallowed for some reason.
        }

        return url;
    }

}

Чтобы запустить его, зарегистрируйте его в файле web.xml следующим образом:

<context-param>
    <param-name>facelets.RESOURCE_RESOLVER</param-name>
    <param-value>com.example.CustomResourceResolver</param-value>
</context-param>
person BalusC    schedule 21.06.2012
comment
Работает отлично :) еще раз большое спасибо за ваше потрясающее знание JSF! - person Steve Atkinson; 22.06.2012