2015-08-04 2 views
1

У меня есть веб-приложение, которое использует дополнительные модули. Модули реализованы в виде проектов веб-фрагментов, их банки могут или не могут быть развернуты с войной в зависимости от профиля сборки.Использование дополнительных библиотек тегов facelet

Модуль может содержать свои собственные module.taglib.xml с пространством имен http://company.com/module и некоторыми тегами.

Шаблоны XHTML войны использовать модуль теги, как это:

<ui:composition ... xmlns:mod="http://company.com/module"> 

<c:if test="#{moduleDeployed}"> 
    <mod:someTag /> 
</c:if> 

проблемы.

  1. Когда модуль не развернут, военные страницы работают хорошо, но в ProjectStage.Development я получаю FacesMessage предупреждения:

    Внимание: Эта страница требует пространства имен XML http://company.com/module объявлена ​​с префиксом мод, но нет taglibrary существует для этого пространства имен.

  2. Насколько я могу судить, спецификация JSF не определяет, что происходит, когда шаблон использует несуществующую библиотеку тегов. Таким образом, при моем текущем типе навигации страницы страниц могут перестать работать после обновления или перейти на другую реализацию JSF.

Вопросы.

  1. Есть ли (не очень уродливый) способ отключить это конкретное предупреждение?
  2. Есть ли лучший подход к использованию дополнительных библиотек тегов facelet?

На данный момент я планирую отключить предупреждение в любом случае, я могу: например. переопределить Message renderer и проверить строку сообщения, если это необходимо. Если проблема 2 проявляется, сделайте файл taglib.xml для размещения сборки для нерасширенных модулей.

+0

Почему бы не убедитесь, что 'необязательно' модуль всегда присутствует? Ваааай легче всех этих хаков. – Kukeltje

+0

Для целей данного вопроса. 1. Не хотите поставлять клиенту больше, чем было заказано. 2. Динамическое связующее вещество, например. Альтернативы CDI. 3. Обеспечение правильности реализации динамической привязки. –

+0

Placeel taglib на самом деле не такая уж плохая идея. – BalusC

ответ

0

Несмотря на то, что тег-метки placeholder выглядели довольно неплохо, они также казались сложнее реализовать и поддерживать.

Итак, в конце я пошел с фильтрацией сообщений. Скорее всего, это особенность Mojarra: текст сообщения, факт, что итератор позволяет удалить (это не запрещено спецификацией, но это также не требуется). Известно, что он работает с Mojarra с 2.2.8 по 2.2.13.

public class SuppressNoTaglibraryExistsFacesMessage implements SystemEventListener { 
    private static final Pattern PTTRN_NO_TAGLIBRARY_EXISTS_FOR_NAMESPACE = 
      Pattern.compile("Warning: This page calls for XML namespace \\S+ declared with " 
      + "prefix \\S+ but no taglibrary exists for that namespace."); 

    @Override 
    public void processEvent(SystemEvent event) { 
     Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages(); 
     while (messages.hasNext()) { 
      String messageSummary = messages.next().getSummary(); 
      if (PTTRN_NO_TAGLIBRARY_EXISTS_FOR_NAMESPACE.matcher(messageSummary).matches()) { 
       messages.remove(); 
      } 
     } 
    } 

    @Override 
    public boolean isListenerForSource(Object source) { 
     return true; 
    } 
} 

Привязать слушателя только к стадии разработки проекта.

public class SubscribeListenersAfterApplicationPostConstructListener 
     implements SystemEventListener { 
    @Override 
    public void processEvent(SystemEvent event) throws AbortProcessingException { 
     Application application = (Application) event.getSource(); 
     if (ProjectStage.Development.equals(application.getProjectStage())) { 
      application.subscribeToEvent(PostAddToViewEvent.class, UIViewRoot.class, 
        new SuppressNoTaglibraryExistsFacesMessage()); 
     } 
    } 

    @Override 
    public boolean isListenerForSource(Object source) { 
     return source instanceof Application; 
    } 

} 

И в лицах-config.xml:

<system-event-listener> 
    <system-event-listener-class><packages>.SubscribeListenersAfterApplicationPostConstructListener</system-event-listener-class> 
    <system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class> 
</system-event-listener> 
+0

Определенно. Добавлено предисловие об этом. –

Смежные вопросы