Java版本:1.8.0_102; Mojarra:2.3.0; Primefaces:6.1.RC2(社区版);
当你能真正在Stackoverflow上引用“StackOverflow”时,它总是很好。
我还没有把它作为一个专门的测试用例,并且XHTML / JSF代码太复杂了,无法在这里复制(这是我使用ui:include
的原因)但我至少可以描述它以便如果其他人遇到同样奇怪的问题,他们知道在哪里看。
我有两个复合组件,我们称之为A和B.
它们都涉及非常大的复杂p:dataTable
,但略有不同,但却分享了p:column
的许多内容。因此,为了不要重复自己(DRY)编码,我使用了多个ui:include
的{{1}}到两个独立的CC,A和B中。
这个工作正常几天。我一直在处理相互包含的部分,引入新的p:column
列,然后突然开始得到StackOverflowError错误:
p:column
我挠头(但还不够秃头)寻找可能是什么原因,并说服自己没有什么会导致递归。
然后我想简单地评论来自"客户"的java.lang.StackOverflowError
at com.sun.el.lang.EvaluationContext.getContext(EvaluationContext.java:91)
at com.sun.faces.el.ImplicitObjectELResolver.getValue(ImplicitObjectELResolver.java:110)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:180)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:208)
at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:116)
at com.sun.el.parser.AstValue.getBase(AstValue.java:151)
at com.sun.el.parser.AstValue.getValue(AstValue.java:200)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.faces.facelets.el.ContextualCompositeValueExpression.getValue(ContextualCompositeValueExpression.java:159)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115)
at javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2487)
at com.sun.faces.el.CompositeComponentAttributesELResolver$ExpressionEvalMap.get(CompositeComponentAttributesELResolver.java:405)
at javax.el.MapELResolver.getValue(MapELResolver.java:199)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:180)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:208)
at com.sun.el.parser.AstValue.getValue(AstValue.java:140)
at com.sun.el.parser.AstValue.getValue(AstValue.java:204)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.faces.facelets.el.ContextualCompositeValueExpression.getValue(ContextualCompositeValueExpression.java:159)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115)
at javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2487)
at com.sun.faces.el.CompositeComponentAttributesELResolver$ExpressionEvalMap.get(CompositeComponentAttributesELResolver.java:405)
at javax.el.MapELResolver.getValue(MapELResolver.java:199)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:180)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:208)
at com.sun.el.parser.AstValue.getValue(AstValue.java:140)
at com.sun.el.parser.AstValue.getValue(AstValue.java:204)
。 CC,A和B,并将复杂的多列ui:include
代码粘贴回A,这一切都运行良好。然后我将它粘贴到B中,它仍然可以正常工作。
它是可重复的。关于在多个p:column
中使用ui:include
的事情正在抛出它,我还不知道是什么(罪魁祸首包括代码对我来说看起来无辜,但正如所说的那样,太复杂了,无法在此处显示)
一个哭泣的耻辱,因为p:column
包含的代码非常复杂,并且在两个不同的CC上下文中再现/编辑/管理它是非常糟糕和可怕的WET(写一切两次,又名我们喜欢打字)。< / p>
第一季度:任何人都可以想到任何可能导致这种情况的事情吗?
Q2:无论如何只是将ui:include
中多列的p:column
方面封装为复合组件?
如果有人能在没有一些棘手的测试的情况下回答Q1,我会感到惊讶。这是一种病态的问题。
如果有解决方案,我会非常惊讶。
将尝试将其作为测试用例进行隔离,但目前问题仍然如上所述。