通过模块库提供时,覆盖PrimeFaces渲染器不工作

时间:2017-08-07 08:40:24

标签: jsf override faces-config custom-renderer

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

这是我的faces-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>

我的网络项目的结构如下:

  • webapp(建立战争),依赖核心和gui
  • 核心(建筑罐子)
  • gui(构建jar),依赖核心,包含xhtmls和@Named Beans,依赖于com.sun.faces:jsf-impl版本2.1.25

当我将faces-config.xml的内容放入时 webapp / src / main / webapp / META-INF或 芯/ SRC /主/ web应用/ META-INF MenuRenderer和ValidationExceptionHandlerFactory都被使用了。呀。

当我将faces-config的内容放入时 GUI / SRC /主/ web应用/ META-INF ValidationExceptionHandlerFactory正在使用,但不是MenuRenderer。 WTF?

此外,所有其他功能(我在faces-config中使用的阶段监听器,系统事件监听器除了render-kit-nodes中的功能外都在工作。

你有什么想法,我做错了什么?

此致,Rokko

1 个答案:

答案 0 :(得分:1)

您正在尝试覆盖由其他外部库提供的渲染器,而不是标准渲染器。

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

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

<name>yourlibrary</name>

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

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