覆盖 PrimeFaces 渲染器在通过模块库提供时不起作用

Overriding PrimeFaces renderer not working when provided via module library

我在覆盖 JSF 渲染器时遇到了一个非常棘手的问题。

这是我脸的一部分-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
    <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
          version="2.0">
    <render-kit>
        <renderer>
            <component-family>org.primefaces.component</component-family>
            <renderer-type>org.primefaces.component.MenubarRenderer</renderer-type>
            <renderer-class>de.mycompany.web.MenuRenderer</renderer-class>
        </renderer>
    </render-kit>
    <factory>
        <exception-handler-factory>de.mycompany.web.ValidationExceptionHandlerFactory</exception-handler-factory>
    </factory>
</faces-config>

我的 web 项目的结构如下

当我把faces-config.xml的内容放在 webapp/src/main/webapp/META-INF 或 core/src/main/webapp/META-INF MenuRenderer 和 ValidationExceptionHandlerFactory 都在使用中。是的。

当我把faces-config的内容放在 gui/src/main/webapp/META-INF 正在使用 ValidationExceptionHandlerFactory,但不使用 MenuRenderer。什么鬼?

除了 render-kit-nodes 中的功能外,我在 faces-config 中使用的所有其他功能(相位侦听器、系统事件侦听器)都在工作。

我做错了什么?

您正在尝试覆盖另一个外部库提供的渲染器,而不是标准渲染器。

外部库提供的faces-config.xml加载顺序默认未定义。在您的特定情况下,您的库显然是在加载 PrimeFaces 库之前 加载的。

您可以通过 faces-config.xml 中的 <ordering> 元素明确指定加载顺序。 PrimeFaces 库的名称是 primefaces。因此,只需将以下条目添加到您的 faces-config.xml。确保您也为您的图书馆提供了一个名称,以便最终用户可以在必要时重新订购他们自己的 faces-config.xml

<name>yourlibrary</name>

<ordering>
    <after>
        <name>primefaces</name>
    </after>
</ordering>

真实世界的例子可以在例如OptimusFaces 也扩展了 PrimeFaces。