Проблема заключалась в контексте #{cc}
и состоятельности составного атрибута. #{cc}
в любом атрибуте вложенных композитных ссылок непосредственно вместо родителя. Атрибут, являющийся stateful, означает, что #{cc}
был переоценен в каждом дочернем элементе, который, в свою очередь, в конечном итоге ссылается на себя вместо родителя. Следовательно, переполнение стека. Он оценивает глубину самого себя в бесконечном цикле.
Я обманул статусность атрибута, сделав его безстоящим, используя компонент backing, как показано ниже, который сразу же оценивает его и присваивает ему как свойство компонента:
@FacesComponent("treeComposite")
public class TreeComposite extends UINamingContainer {
private Integer depth;
@Override
public void setValueExpression(String name, ValueExpression binding) {
if ("depth".equals(name)) {
setDepth((Integer) binding.getValue(getFacesContext().getELContext()));
}
else {
super.setValueExpression(name, binding);
}
}
public Integer getDepth() {
return depth;
}
public void setDepth(Integer depth) {
this.depth = depth;
}
}
, который должен быть объявлен в интерфейсе componentType
, как показано ниже:
<cc:interface componentType="treeComposite">
<cc:attribute name="depth" type="java.lang.Integer" />
</cc:interface>
И в реализации вы должны в тестовой ссылке использовать свойство stateless и вложенную составную ссылку один из родительских (поскольку #{cc}
в атрибуте вложенного композита ссылается на сам вложенный композит):
<cc:implementation>
<br />We're at depth #{cc.depth}.
<c:if test="#{cc.depth gt 0}">
<my:tree depth="#{cc.parent.depth - 1}" />
</c:if>
</cc:implementation>
Я только изменил значение «глубина» здесь, чтобы быть наоборот так что он просто декларативный от клиента без необходимости редактировать его в реализации. Итак, в клиенте вы должны сказать depth="#{3}"
, если хотите 3 вложенных дочерних элемента:
<my:tree depth="#{3}" />
Обратите внимание на важность того, что это выражение EL, а не буквальное. В противном случае setValueExpression()
в компоненте подложки не будет вызываться.
использование в спящем режиме или аннотации JPA:
class User {
@Enumerated(EnumType.STRING)
UserType type
}
UserType является просто стандартным перечислением java 5.
я не могу предположить, что это просто ограничено просто аннотациями, но я на самом деле не знаю, как сделать это с hbm файлами. Это может быть очень иждивенец версии, я предполагаю, но я вполне уверен, которые в спящем режиме 3.2 +, требуется.
редактирование: это возможно в hbm, но немного грязно, взгляните на этот поток форума
Из Быть в спящем режиме документации: http://www.hibernate.org/272.html
можно создать новое определение типа для каждого из перечислений и сослаться на определения типов в теге свойства.
Отображение В качестве примера - встроенный <type>
тег
<property name='suit'>
<type name="EnumUserType">
<param name="enumClassName">com.company.project.Suit</param>
</type>
</property>
Отображение В качестве примера - использование <typedef>
<typedef name="suit" class='EnumUserType'>
<param name="enumClassName">com.company.project.Suit</param>
</typedef>
<class ...>
<property name='suit' type='suit'/>
</class>