自定义 org.primefaces.component.messages.MessagesRenderer

Customising org.primefaces.component.messages.MessagesRenderer

背景

我们有一个使用 JSF2.0 的在线应用程序(Web-sphere 应用程序服务器 v8.5.5 附带的一个)+ PrimeFaces 5.0

要求

对于特定要求,我们必须自定义 org.primefaces.component.messages.MessagesRenderer。我们注意到没有干净的方法来自定义 org.primefaces.component.messages.MessagesRenderer 。 作为解决方法,我们在 Web Source 文件夹中创建了 class org.primefaces.component.messages.MessagesRenderer。这个 class 最终在 WebInf/classes

问题

在初始部署时,prime-faces.jar 在 WebInf/classes 中加载了 org.primefaces.component.messages.MessagesRenderer 的版本,一切都按预期进行。 经过进一步调查,很明显 war class 加载行为不一致。我们无法保证 Prime Faces 框架加载了哪个版本的 org.primefaces.component.messages.MessagesRenderer。有时,应用程序从 WebInf/classes 加载 org.primefaces.component.messages.MessagesRenderer 的版本,有时它从 WebInf/lib/primefaces-5.0.jar

加载版本

Servlet3.0明确指出

Web 应用程序 class 加载程序必须从 WEB-INF/classes 加载 classes 首先是目录,然后是 WEB-INF/lib 目录中的库 JAR。

所以不确定为什么我们会遇到这种不一致的行为。

尝试过的和建议的

总结

总而言之,我们真正想要的是一种无需修补 primefaces jar 文件即可在 prime-faces 中自定义 org.primefaces.component.messages.MessagesRenderer 的方法。

刚刚找到这个问题的解决方案

在 applications faces-config.xml 中添加以下代码片段允许我覆盖 primefaces 中的 MessageRenderer

   <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.MessageRenderer</renderer-type>
        <renderer-class>my.CustomRenderer</renderer-class>
    </renderer>