嵌套复合组件在JBoss 7.1.1中被破坏

时间:2012-03-16 10:28:25

标签: jsf-2 jboss7.x composite-component

我们在项目的其他组件中使用复合组件。在JBoss 7.1.0 上一切正常,但在JBoss 7.1.1 上我们会遇到这样的错误:

No handlers found for exception javax.faces.view.facelets.TagException: 
/resources/components/my/bigComponent.xhtml @21,47 <my:nestedComponent> 
Tag Library supports namespace: http://java.sun.com/jsf/composite/components/my, 
but no tag was defined for name: nestedComponent

我们尝试了this JBoss community thread中建议的解决方案,但它没有改变我们的问题(接缝我们不是the only one in this case,解决方案可能无效,因为我们也在{{1}来自模板文件的标签)。

这是我们的两个组成部分:

嵌套:

ui:define

嵌套:

<!DOCTYPE html PUBLIC ...>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:cc="http://java.sun.com/jsf/composite"
  xmlns:my="http://java.sun.com/jsf/composite/components/my" >

<cc:interface componentType="...">
    <h:panelGroup>
        <cc:attribute name="someAttribute" />
    </h:panelGroup>
</cc:interface>

<cc:implementation>
     <my:nestedComponent content="a text" />
</cc:implementation>
</html>

这是回归吗?我们做错了吗?在第一个链接中,建议的解决方案在嵌套组件中暗示如下:

<!DOCTYPE html PUBLIC ...>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:cc="http://java.sun.com/jsf/composite">

<cc:interface>
    <cc:attribute name="content" />
</cc:interface>

<cc:implementation>
    <h:outputText value="#{cc.attrs.content}" />
</cc:implementation>

</html>

这个<composite:interface> <composite:facet name="greet1"/> <composite:facet name="greet2"/> </composite:interface> <composite:implementation> <lib:greet1 name="Stan" /> <lib:greet2 name="Silvert" /> </composite:implementation> 没有任何composite:facet是什么?

2 个答案:

答案 0 :(得分:9)

Valentinx在this thread找到了解决方法。

这个想法是将错误的名称空间声明放在<composite:implementation>本身上,所以

<!DOCTYPE html PUBLIC ...>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:cc="http://java.sun.com/jsf/composite"
  xmlns:my="http://java.sun.com/jsf/composite/components/my" >
<cc:interface />
<cc:implementation>
     <my:nestedComponent content="a text" />
</cc:implementation>
</html>

变为

<!DOCTYPE html PUBLIC ...>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:cc="http://java.sun.com/jsf/composite" >
<cc:interface />
<cc:implementation xmlns:my="http://java.sun.com/jsf/composite/components/my">
     <my:nestedComponent content="a text" />
</cc:implementation>
</html>

(请注意 <cc:implementation xmlns:my="http://java.sun.com/jsf/composite/components/my"> 标记)

这就像一个魅力!

答案 1 :(得分:0)

感谢Xavier的回答:这是正确的!我想添加评论,但没有代表。这样做。

在我的情况下,问题有点不同,模板上有错误(不是复合:实现),我找到了一个不包含&lt; cc:implementation&gt;的解决方案。 ...

相反,从&lt; html&gt;移动模板中的xmlns:layoutComp到一个容器(&#39; div&#39;以及&#39; span&#39;工作):

<span xmlns:layoutComp="http://java.sun.com/jsf/composite/layoutComp">
        <layoutComp:navigation />
</span>