Настройка, в которой я работаю, это JSF2 в JBoss AS7 с Seam-2.3.Почему richfaces посещает узлы, которые не были указаны в атрибуте execute?
Я менеджер боб получить Называется через в большом шаблоне через <a4j:commandButton>
как так:
<rich:dataTable value="#{listFactory.getMyList()}" var="ll">
...
</rich:dataTable>
...
<a4j:repeat id="jobs" value="#{person.jobs}" var="job">
<h:outputText value="#{job.name}" />
</a4j:repeat>
<a4j:commandButton value="more" immediate="true"
action="#{personManager.addJob}" render="jobs" limitRender="true" />
Соответствующий код из personManager
:
@Name("personManager")
@Scope(ScopeType.CONVERSATION)
public class PersonMgr {
private Person person;
@Begin(flushMode = FlushModeType.MANUAL)
public void selectObjects() {
// grab the person from the request if there's one
}
@End
public void saveChanges() {
em.flush();
}
public void addJob() {
person.getJobs().add(new Job());
}
}
что теперь personManager
делает это в звоните person.jobs.add(new Job())
на приватном, все еще переходном объекте bean person
. Перед тем как он может сделать это, запрос умирает со следующим StackTrace:
javax.el.ELException: /person.xhtml @412,95 value="#{listFactory.getMyList()}": org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Person
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.richfaces.component.UISequence.getValue(UISequence.java:175) [richfaces-components-ui.jar:4.3.0.Final]
at org.richfaces.component.UISequence.createExtendedDataModel(UISequence.java:109) [richfaces-components-ui.jar:4.3.0.Final]
at org.richfaces.component.UIDataTableBase.createExtendedDataModel(UIDataTableBase.java:252) [richfaces-components-ui.jar:4.3.0.Final]
at org.richfaces.component.UIDataAdaptor.getExtendedDataModel(UIDataAdaptor.java:459) [richfaces-components-ui.jar:4.3.0.Final]
at org.richfaces.component.UIDataAdaptor.setRowKey(UIDataAdaptor.java:272) [richfaces-components-ui.jar:4.3.0.Final]
at org.richfaces.component.UIDataAdaptor.visitTree(UIDataAdaptor.java:1312) [richfaces-components-ui.jar:4.3.0.Final]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIForm.visitTree(UIForm.java:371) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.richfaces.context.ExtendedPartialViewContextImpl.visitActivatorComponent(ExtendedPartialViewContextImpl.java:448) [richfaces-core-impl.jar:4.3.0.Final]
at org.richfaces.context.ExtendedPartialViewContextImpl.visitActivatorAtExecute(ExtendedPartialViewContextImpl.java:309) [richfaces-core-impl.jar:4.3.0.Final]
at org.richfaces.context.ExtendedPartialViewContextImpl.getExecuteIds(ExtendedPartialViewContextImpl.java:98) [richfaces-core-impl.jar:4.3.0.Final]
at org.richfaces.context.ExtendedPartialViewContextImpl.isExecuteAll(ExtendedPartialViewContextImpl.java:148) [richfaces-core-impl.jar:4.3.0.Final]
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:929) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
Отладка этого ExtendedPartialViewContext действительно «получить», что он должен выполнять только компонент CommandButton, но затем появляется, чтобы перейти к визуализации ходьбы полное дерево JSF? Я имею в виду, почему значение этого списка даже оценивается? Это даже в div, который должен оцениваться до rendered=false
во время обратной передачи. Мне, должно быть, не хватает чего-то очевидного здесь?
Что первое пришло в голову, что, может быть, pages.xml вмешивается (вызывает selectObjects
но действие имеет атрибут on-postback="false"
набор), или мне нужно добавить <a4j:keepAlive>
- но так, что ушел в Richfaces4 я не могу сделать это и не должен ли диапазон разговора охватывать запросы AJAX?
Обратите внимание, что «полное дерево визит» не то же самое, как «полная визуализация» или так. Как еще JSF найдет компоненты, включенные в 'execute', кроме перемещения дерева компонентов? Нет отдельного отображения компонентов по ID или так. Что он все еще посещает дерево, а 'rendered =" false "- второй вопрос. В этот момент нет способа гарантировать, что он также был бы «ложным» во время отклика от предыдущего запроса. – BalusC
Итак, в нижней строке: я должен убедиться, что все 'значение', которое я использую в любом месте на странице, легко доступны для обработки и/или посещения, когда JSF считает нужным даже при ограничении обработки запроса с помощью 'execute'? Я «исправил» ошибку, проверив, должен ли я использовать сущность при вычислении «значения» dataTable (т. Е. Использовать только entityManager, если постоянная сущность). Но да, вроде бы контр-интуитивный, даже если я понимаю необходимость полного обхода дерева. Тем не менее, почему он вычисляет значение и не просто проверяет идентификатор? – mabi
Идентификаторы компонентов в компонентах ретранслятора, такие как 'UIData' и' UIRepeat', изменяются на основе каждой итерации (они получают суффикс индекса строки). Значение просто запрашивается для определения размера. Кроме того, выполнение бизнес-логики в методе геттера - это плохая практика. Это должно быть сделано в (post) конструкторе или (action) методе слушателя. – BalusC