JSF valueChangeListener

Raderbe

Grünschnabel
Hallo *,

habe eine kleine JSF (JEE) - Anwendung gebaut. Diese hat
  • eine Combobox. Sobald der Anwender einen Wert auswählt, wird ein valueChangeEvent gefeuert. Dieser wird von einem Listener aufgegriffen, der den neuen Wert im Model setzt.
  • einen Button. Sobald der Button geklickt wird, wir das Form submitted und eine Aktion ausgeführt.
Soweit, so gut. Das Problem ist, dass bei Submit des Formulars über den Button auch ein ValueChangeEvent gefeuert wird. Das kann ich nicht nachvollziehen. Als Folge wird die eigentliche Aktion nie ausgeführt, die Anwendung geht immer in den ValueChangeListener.

Im Anhang befindet sich ein ear, welches sehr einfach über "mvn clean install" gebaut und direkt z.B. auf einem Wildfly deployed werden kann.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!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:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:body>
    <h:form>
        <h:panelGrid columns="3">
            <h:outputLabel value="Projekt"
                           for="projectSelector"/>
            <h:selectOneMenu id="projectSelector"
                             value="#{timeBean.model.projectSelected}"
                             converter="projectConverter"
                             onchange="submit()"
                             valueChangeListener="#{timeBean.projectChanged}"
                             immediate="true"
                             required="true">
                <f:selectItems value="#{timeBean.model.allProjects}"
                               var="singleProject"
                               itemValue="#{singleProject}"
                               itemLabel="#{singleProject.name}"/>
            </h:selectOneMenu>
            <h:message for="projectSelector"/>
        </h:panelGrid>

        <h:panelGrid columns="1">
            <h:commandButton value="Absenden"
                             action="#{timeBean.myAction}"
                             ajax="false"/>

            <h:outputLabel value="#{timeBean.model.resultValue}" rendered="#{not empty timeBean.model.resultValue}"/>
        </h:panelGrid>
    </h:form>
</h:body>
</html>
Java:
@Named
@ViewScoped
public class TimeBean implements Serializable {

    @Inject
    private ValueProvider valueProvider;

    @Inject
    private Logger log;

    private TimeModel model;

    @PostConstruct
    public void init() {
        model = new TimeModel();
        final List<ProjectEntity> allProjects = valueProvider.getAllProjects();
        model.setAllProjects(allProjects);
        model.setProjectSelected(allProjects.get(0));
    }

    public String myAction() {
        log.info("myAction called");
        model.setResultValue("action was called");
        return null;
    }

    public void projectChanged(final ValueChangeEvent event) {
        final ProjectEntity projectSelected = (ProjectEntity) event.getNewValue();
        log.info("value changed from " + model.getProjectSelected().getId() + " to " + projectSelected.getId());
        model.setProjectSelected(projectSelected);
        final FacesContext context = FacesContext.getCurrentInstance();
        context.renderResponse();
    }

    public TimeModel getModel() {
        return model;
    }

    public void setModel(TimeModel model) {
        this.model = model;
    }

}
Java:
public class ProjectEntity {
    private Long id;
    private String name;
    [...getter und setter...]

    @Override
    public boolean equals(final Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        final ProjectEntity that = (ProjectEntity) o;
        System.out.println("equals comparing this " + this.getId() + " to that " + that.getId());

        return id != null ? id.equals(that.id) : that.id == null;
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }

    @Override
    public String toString() {
        return "ProjectEntity{" + "id=" + id + ", name='" + name + "'}";
    }

}
 

Anhänge

Zurück