Почему мой компонент ViewScoped не выжил h: commandButton? - PullRequest
2 голосов
/ 25 марта 2012

Развертывание на JBoss AS 7.1.0.Final.

У меня очень простое тестовое приложение.Он работал, как и ожидалось, на днях (известные последние слова) и больше не занимается самым простым делом, а именно установкой значения входного компонента и использованием его в компоненте действия.Я разобрал эту вещь до основ и не могу понять, что происходит.

index.xhtml здесь

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html">

<h:head>
  <title>contacts</title>
</h:head>
<h:form>
    <h:outputLabel value="Message:" />
    <h:inputText value="#{contactView.siteCode}" />
    <h:commandButton  action="#{contactView.save}" value="Save" />

</h:form>

</html>

Боб ViewScoped здесь

@Named
@ViewScoped
public class ContactView implements Serializable {

    public ContactView() {
    }

    private String siteCode;

    public String getSiteCode() {
        System.out.println("getSiteCode: "+ siteCode);
        return siteCode;
    }

    public void setSiteCode(String siteCode) {
        System.out.println("setSiteCode: "+ siteCode);
        this.siteCode = siteCode;
    }

    public String save(){
        System.out.println("Saving sitecode: " + siteCode);
        return "index.jsf";
    }


}

Что я делаю не так?Когда я нажимаю на кнопку сохранения, я получаю это в выводе

10:50:37,663 INFO  [stdout] (http--0.0.0.0-8080-2) setSiteCode: 22
10:50:37,663 INFO  [stdout] (http--0.0.0.0-8080-2) Saving sitecode: null
10:50:37,663 INFO  [stdout] (http--0.0.0.0-8080-2) getSiteCode: null

1 Ответ

5 голосов
/ 25 марта 2012

Это потому, что боб управляется CDI @Named, а не JSF @ManagedBean. Аннотации области действия JSF пакета javax.faces.bean работают только для bean-компонентов, управляемых JSF. На бине, управляемом CDI, вам нужно вместо этого использовать аннотации CDI javax.enterprise.context. Тем не менее, CDI не имеет понятия области видимости. Ближайший @ConversationScoped, но это сложнее в управлении. Если вы не укажете область действия в управляемом компоненте CDI, по умолчанию будет использоваться область запроса.

Убедитесь, что JSF управляет вашим компонентом всякий раз, когда вы хотите использовать @ViewScoped.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class ContactView implements Serializable {
    // ...
}

Кроме того, вам также необходимо убедиться, что ваши методы действия возвращают null или void всякий раз, когда вы хотите сохранить область просмотра.

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