Customising org.primefaces.component.messages.MessagesRender



Background

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

要求

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

问题

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

Servlet3.0 明确指出

Web 应用程序类装入器必须从 WEB-INF/类装入类首先是目录,然后是从 WEB-INF/lib 目录中的库 JAR 开始。

所以不知道为什么我们会经历这种不一致的行为。

尝试过什么和建议

  • 我们尝试引用org.primefaces.component.messages.MessagesRenderer in servlet startup听者。

  • 我的一位同事建议删除 org.primefaces.component.messages.MessagesRenderer in primefaces jar文件。这将解决问题,但自定义第三方库违反了我们公司的政策。

总结

总之,我们真正正在寻找一种在不修补primefaces jar文件的情况下自定义primefaces.component.messages.MessagesRenderer的方法。

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

在应用程序 faces-config.xml 中添加以下代码片段,允许我在 primeface 中覆盖 MessageRenderer

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

最新更新