0

Java版本:1.8.0_102;莫哈拉:2.3.0;Primefaces:6.1.RC2(社区版);

当您可以在 Stackoverflow 上真正引用“StackOverflow”时,总是很好。

我还没有把它隔离为一个专门的测试用例,XHTML/JSF 代码太复杂,无法在这里重现(这是我使用的原因ui:include),但我至少可以描述它,这样如果其他人遇到同样奇怪的问题,他们知道在哪里看。

我有两个复合组件,我们称它们为 A 和 B。

它们都涉及非常大的复杂p:dataTable性,但略有不同,但共享的正是很多p:column。因此,为了不要重复自己(DRY)编码,我在两个单独的 CC A 和 B 中都使用了一个ui:include倍数。p:column

这工作了几天。我一直在研究相互包含的部分,引入新p:column列,然后突然开始出现 StackOverflowError 错误:

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)

我挠了挠头(但还不够秃头)寻找可能的原因,并说服自己没有什么会导致递归。

然后我想简单地注释掉ui:include两个“客户端”CC,A和B,并将复杂的多列p:column代码粘贴回A,一切正常。然后我将它也粘贴到B中,它仍然可以正常工作。

它是可重现的。关于使用ui:include跨倍数的东西p:column是抛出它,我还不能找出是什么(罪魁祸首包括的代码对我来说看起来很无辜,但正如所说,这里太复杂了,无法在这里展示)。

非常遗憾,因为ui:include包含的代码非常复杂,并且在两个不同的 CC 上下文中复制/编辑/管理它是费力和可怕的 WET(写两次,又名我们喜欢打字)。

Q1:谁能想到可能导致这种情况的任何事情?

Q2:有没有将p:columna 中的多个列的方面封装p:dataTable为一个复合组件?

如果有人可以在没有一些棘手的测试的情况下回答 Q1,我会感到惊讶。这是一个病态的陷阱。

如果有 Q2 的解决方案,我会非常惊讶。

将尝试将其隔离为测试用例,但现在问题与描述的一样。

4

0 回答 0