<my:foo>标记库支持命名空间:http://java.sun.com/jsf/composite/mycomponents,但没有为name定义标记:foo </my:foo>

时间:2012-06-05 14:08:48

标签: java jsf jsf-2 composite-component nested

我有一个名为<my:foo>的复合组件,我正在构建另一个名为<my:bar>的复合组件。但是当我尝试在<my:foo>的{​​{1}}内使用<cc:implementation>时,会抛出以下异常:

  

<my:bar>标记库支持命名空间:http://java.sun.com/jsf/composite/mycomponents,但没有为名称定义标记:foo

这是如何引起的?如何解决?

1 个答案:

答案 0 :(得分:2)

这是由Mojarra 2.1.8中引入的错误引起的,在2.1.9中继续,并在2.1.10中修复。此错误导致无法在<ui:component> / <ui:composition> / <html> / etc等根XML元素中声明复合组件自己的XML命名空间,如下所示:

<ui:component 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:my="http://java.sun.com/jsf/composite/mycomponents"
>
    <cc:interface>
        ...
    </cc:interface>
    <cc:implementation>
        <my:foo />
    </cc:implementation>
</ui:component>

当您尝试在<my:foo>内嵌套<cc:implementation>时,这会导致以下异常。

  

<my:foo>标记库支持命名空间:http://java.sun.com/jsf/composite/mycomponents,但没有为名称定义标记:foo

除了降级到2.1.7并等待2.1.10发布之外,当前的解决方法是将XML名称空间声明移到<cc:implementation>

<ui:component 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
>
    <cc:interface>
        ...
    </cc:interface>
    <cc:implementation xmlns:my="http://java.sun.com/jsf/composite/mycomponents">
        <my:foo />
    </cc:implementation>
</ui:component>

另见: