2013-02-28 3 views
0

Настройка, в которой я работаю, это 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?

+0

Обратите внимание, что «полное дерево визит» не то же самое, как «полная визуализация» или так. Как еще JSF найдет компоненты, включенные в 'execute', кроме перемещения дерева компонентов? Нет отдельного отображения компонентов по ID или так. Что он все еще посещает дерево, а 'rendered =" false "- второй вопрос. В этот момент нет способа гарантировать, что он также был бы «ложным» во время отклика от предыдущего запроса. – BalusC

+0

Итак, в нижней строке: я должен убедиться, что все 'значение', которое я использую в любом месте на странице, легко доступны для обработки и/или посещения, когда JSF считает нужным даже при ограничении обработки запроса с помощью 'execute'? Я «исправил» ошибку, проверив, должен ли я использовать сущность при вычислении «значения» dataTable (т. Е. Использовать только entityManager, если постоянная сущность). Но да, вроде бы контр-интуитивный, даже если я понимаю необходимость полного обхода дерева. Тем не менее, почему он вычисляет значение и не просто проверяет идентификатор? – mabi

+0

Идентификаторы компонентов в компонентах ретранслятора, такие как 'UIData' и' UIRepeat', изменяются на основе каждой итерации (они получают суффикс индекса строки). Значение просто запрашивается для определения размера. Кроме того, выполнение бизнес-логики в методе геттера - это плохая практика. Это должно быть сделано в (post) конструкторе или (action) методе слушателя. – BalusC

ответ

0

Существует ошибка в RichFaces, что значение атрибута компонентов проходящими UIDataAdaptor оценивается на «дереве визита», даже если оно вынесено = ложь: https://issues.jboss.org/browse/RF-11382

обновление Попробуйте RichFaces 4.3.0.Final, где ошибка исправлена, или применить обходной путь (обходной путь должен быть повторен на каждом компоненте, простирающейся UIDataAdaptor):

public class UIDataTableWorkaround extends UIDataTable { 
    @Override 
    public void setRowKey(FacesContext facesContext, Object rowKey) { 
    if (rowKey == null && getRowKey() == null) { 
     return; 
    } 
    super.setRowKey(facesContext, rowKey); 
    } 
} 

и лицами-конфигурации:

<component> 
    <component-type>org.richfaces.DataTable</component-type> 
    <component-class>com.example.UIDataTableWorkaround</component-class> 
    </component> 
+0

Ну, это странно, потому что я использую RF4.3.0.Final с моим ухом. Как указывает BalusC, существует ли даже способ узнать, что таблица не должна отображаться, когда только посещение (а не рендеринг) - я также подчеркиваю, что таблица содержится в '', он не имеет атрибута rendered. – mabi

+0

@mabi Как я вижу, нет такого атрибута 'rendered', который поддерживается' ui: fragment'. Попробуйте поместить 'rendered =" false "' в самой таблице или заменить 'ui: fragment' тем, что поддерживает этот атрибут (например,' h: panelGroup'). – Andrey

+0

Aw, мой плохой. Если посмотреть на фактический код, я использовал 's: div' (который имеет атрибут rendered) вместо' ui: fragment'. Таблица не является единственной вещью, контролируемой этим атрибутом, поэтому имеет смысл (по крайней мере, для меня) представить «rendered» как можно выше по дереву компонентов. – mabi

 Смежные вопросы

  • Нет связанных вопросов^_^