如何将数据从selectManyCheckbox发送到bean?

时间:2018-06-04 09:49:48

标签: primefaces

我有一个带有JSF和primefaces的Java EE设置,我正在尝试根据<selectOneMenu>中选择的条目生成一个选择。 我的问题是selectManyCheckbox(或任何其他类似的ui元素)已正确填写所有项目并且项目是可选择的,但如果进行了选择,则commandButton的操作无法获得调用。 我在方法上设置了一个断点。如果我没有选择任何项目,断点就会被击中,如果我选择任何数量大于零的项目,断点就不会被击中。

我读到一个解决方案可能是定义一个转换器。我试过了,如果我设置一个断点,它正确地转换了我选择的项目,但是仍然没有调用定义为action的方法。

Btw:对不起德国代码,我是德国人,并指定德国的方法和变量由指南设定

xhtml文件:

<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>());
        }
    }
}

转化器:

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;
    }
}

1 个答案:

答案 0 :(得分:0)

感谢Mike Balthasar的评论!

解决方案是将ajax="false"添加到我的commandButton。 有关更多信息,请参阅他的评论。