覆盖 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 项目的结构如下
- webapp(构建 war),对核心和 gui 的依赖
- 核心(构建 jar)
- gui(构建 jar),对核心的依赖,包含 xhtmls 和 @Named Beans,对 com.sun.faces:jsf-impl 版本 2.1.25
的依赖
当我把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。
我在覆盖 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 项目的结构如下
- webapp(构建 war),对核心和 gui 的依赖
- 核心(构建 jar)
- gui(构建 jar),对核心的依赖,包含 xhtmls 和 @Named Beans,对 com.sun.faces:jsf-impl 版本 2.1.25 的依赖
当我把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。