JSF selectBooleanCheckbox не вызывает связанный метод сеттера, если он отображается условно - PullRequest
2 голосов
/ 21 сентября 2011

Я использую Mojarra 2.0.3 на JBoss 6.1.0 final.У меня проблема с методом установки значения для h: selectBooleanCheckbox, который не вызывается, если в теге указан условный рендеринг.

В частности:

JSF:

<h:selectBooleanCheckbox value="#{somebean.checked}" rendered="#{somebean.render}" />

Пример кода компонента:

private Boolean checked = new Boolean(false);

public Boolean getChecked() {return checked;}

public void setChecked(Boolean checked) {this.checked = checked;}

public boolean getRender() {return true;}

Проблема в том, что setChecked() метод никогда не вызывается при отправке формы.Если я удалю атрибут «rendered», сеттер будет вызван, как и ожидалось.Только когда тег условно отображается, он не обрабатывается при отправке.В любом случае геттер вызывается нормально.

Если я устанавливаю valueChangeListener, это также не вызывается, если selectBooleanCheckbox отображается условно.Наконец, включение тега h: selectBooleanCheckbox в контейнер, такой как: panelGrid, и установка условного рендеринга для «внешнего» компонента приводит к тому же поведению.Похоже, этот флажок не будет обработан, если он будет отображен условно.

Это кажется чем-то базовым, поэтому я предполагаю, что что-то упускаю.Кто-нибудь имеет подобный опыт с этим?

ОБНОВЛЕНИЕ : Управляемый компонент в этом случае является компонентом CDI ConversationScoped.Дальнейшая отладка, казалось, подсказывала, что другой экземпляр компонента был создан и использован где-то в жизненном цикле JSF.Поэтому я изменил bean-компонент, чтобы сделать диалог непостоянным в методе postConstruct.Это заставило JSF выдать следующее исключение при оценке выражения EL, используемого в атрибуте «render»:

23:41:12,179 WARNING[javax.enterprise.resource.webcontainer.jsf.lifecycle] /admin/edit_user_profile.xhtml @41,72 rendered="#{profileEditor.isCurrentUser}": java.lang.IllegalStateException: javax.el.ELException: /admin/edit_user_profile.xhtml @41,72 rendered="#{profileEditor.isCurrentUser}": java.lang.IllegalStateException
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) [:2.0.3-]
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) [:2.0.3-]
    at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:417) [:2.0.3-]
.
.
.
Caused by: java.lang.IllegalStateException
    at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:635) [:2.0.3-]
    at com.sun.faces.context.FacesContextImpl.getExternalContext(FacesContextImpl.java:135) [:2.0.3-]
    at com.sgi.tds.web.admin.beans.TdsAdminBean.getCurrentUser(TdsAdminBean.java:36) [:]
    at com.sgi.tds.web.admin.beans.UserProfileEditorBean.getIsCurrentUser(UserProfileEditorBean.java:153) [:]
    at com.sgi.tds.web.admin.beans.UserProfileEditorBean$Proxy$_$$_WeldClientProxy.getIsCurrentUser(UserProfileEditorBean$Proxy$_$$_WeldClientProxy.java) [:]

1 Ответ

2 голосов
/ 21 сентября 2011

Как часть защиты от атаки, атрибут rendered переоценивается, когда JSF обрабатывает отправку формы.То, что он оценивает false в вашем конкретном случае, может означать только то, что ваш бин имеет область запроса и что вы не сохранили значение атрибута в конструкторе (post) бина.

Если вы не можете его сохранить,затем вам нужно поместить бин в область видимости.

@ManagedBean
@ViewScoped
public class Somebean {

    // ...
}

Таким образом, экземпляр боба живет до тех пор, пока вы взаимодействуете с одним и тем же представлением.См. Также этот связанный вопрос / ответ: commandButton / commandLink / ajax действие / метод слушателя не вызван или входное значение не обновлено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...