i have a Java EE setup with JSF and primefaces and i'm trying to generate a selection, based on the chosen entry in a <selectOneMenu>
.
My problem is that the selectManyCheckbox
(or any other similar ui element) has all items filled in correctly and the items are selectable, but if a selection was made, the action of the commandButton
doesn't get called.
I've set a breakpoint on the method. If I don't choose any item, the breakpoint gets hit, if I choose any amount of items greater than zero, the breakpoint doesn't get hit.
I read that one solution could be to define a converter. I tried that and if I set a breakpoint, it correctly converts the items, I chose, but nevertheless the method, defined as action, doesn't get called.
Btw: Sorry for german code, i'm a german and naming the methods and variables in german was set by guideline
The xhtml File:
<h:form>
<p:panelGrid columns="2">
<p:outputLabel for="kennzeichenInput">Kennzeichen: </p:outputLabel>
<p:inputText id="kennzeichenInput"></p:inputText>
<p:outputLabel for="studiengang">Studiengang: </p:outputLabel>
<p:selectOneMenu id="studiengang" value="#{registrationsController.gewaehlterStudiengang}">
<f:selectItem itemValue="#{null}" itemLabel="--Studiengang aussuchen--"/>
<f:selectItems value="#{registrationsController.getAlleStudiengaenge()}"/>
<p:ajax value="valueChange" update="vorlesungenInStudiengang" listener="#{registrationsController.onStudiengangGeaendert}"/>
</p:selectOneMenu>
</p:panelGrid>
<h:selectManyCheckbox id="vorlesungenInStudiengang"
value="#{registrationsController.gewaehlteVorlesungen}"
label="Vorlesungen" converter="de.phwt.parkhwt.domain.converter.vorlesung_converter">
<f:selectItems value="#{registrationsController.vorlesungen}"/>
</h:selectManyCheckbox >
<p:commandButton value="Registrieren" type="submit" action="#{registrationsController.registriereKennzeichen()}"/>
</h:form>
The Bean:
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.enterprise.context.RequestScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;
import javax.inject.Named;
import de.phwt.parkhwt.domain.CollectionKonverter;
import de.phwt.parkhwt.domain.KennzeichenRepository;
import de.phwt.parkhwt.domain.Studiengang;
import de.phwt.parkhwt.domain.Vorlesung;
@RequestScoped
@Named
public class RegistrationsController
{
@Inject
private KennzeichenRepository repository;
private String gewaehlterStudiengang;
private List<Vorlesung> vorlesungen;
private List<Vorlesung> gewaehlteVorlesungen;
public String getGewaehlterStudiengang()
{
return gewaehlterStudiengang;
}
public void setGewaehlterStudiengang(String gewaehlterStudiengang)
{
this.gewaehlterStudiengang = gewaehlterStudiengang;
}
public List<Vorlesung> getVorlesungen()
{
return vorlesungen;
}
public void setVorlesungen(List<Vorlesung> vorlesungen)
{
this.vorlesungen = vorlesungen;
}
public Vorlesung getVorlesung(String name)
{
return this.repository.sucheVorlesung(name);
}
public List<Vorlesung> getGewaehlteVorlesungen()
{
return gewaehlteVorlesungen;
}
public void setGewaehlteVorlesungen(List<Vorlesung> gewählteVorlesungen)
{
this.gewaehlteVorlesungen = gewählteVorlesungen;
}
public Set<Studiengang> getAlleStudiengaenge()
{
return repository.getAlleStudiengaenge();
}
public List<Vorlesung> getVorlesungenDesStudiengangs(String gewaehlterStudiengang)
{
Studiengang studiengang = repository.sucheStudiengang(gewaehlterStudiengang);
return CollectionKonverter.toList(studiengang.getVorlesungen());
}
public String registriereKennzeichen()
{
return "";
}
public void onStudiengangGeaendert(AjaxBehaviorEvent event)
{
if (getGewaehlterStudiengang() != null)
{
setVorlesungen(getVorlesungenDesStudiengangs(getGewaehlterStudiengang()));
}
else
{
setVorlesungen(new ArrayList<Vorlesung>());
}
}
}
The Converter:
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.inject.Inject;
import de.phwt.parkhwt.controller.RegistrationsController;
@FacesConverter("de.phwt.parkhwt.domain.converter.vorlesung_converter")
public class VorlesungConverter implements Converter
{
@Inject
KennzeichenRepository repository;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
ValueExpression vex =
context.getApplication()
.getExpressionFactory()
.createValueExpression(context.getELContext(),
"#{registrationsController}", RegistrationsController.class);
RegistrationsController reg = (RegistrationsController) vex.getValue(context.getELContext());
Vorlesung vorlesung = reg.getVorlesung(value);
return vorlesung;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
if (value.getClass() == new Vorlesung().getClass())
{
Vorlesung v = (Vorlesung) value;
return v.getName();
}
return null;
}
}