包含Picklist的Dialog中的CommandButton不会触发操作方法

时间:2017-01-30 12:52:22

标签: jsf primefaces

我遇到的问题是我的对话框中的命令按钮不会触发控制器中的动作方法。没有记录器输出示例方法“greet”。任何人都可以看一下请给我提示吗?我做错了什么?

我的JSF-Page:

<!DOCTYPE HTML>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">

<f:view id="bestellungLieferantView">
    <f:metadata>
        <f:event type="preRenderView"
            listener="#{camundaTaskForm.startTaskForm()}" />
    </f:metadata>
    <h:head>
        <title>Paket zusammenstellen</title>
    </h:head>
    <h:body>
        <h:form id="bestellungLieferantForm">
            <p:dialog id="komponentenAuswahlDialog"
                header="Komponenten auswählen" widgetVar="komponentenAuswahlDialog"
                modal="true" height="auto" width="auto">

                    <p:pickList id="komponenteAuswahlPickList"
                        value="#{bestellungLieferantController.komponentenDualListModel}"
                        var="komponente" itemLabel="#{komponente.serienNummer}"
                        converter="entityConverter"
                        itemValue="#{komponente}" showSourceFilter="true"
                        showTargetFilter="true">
                        <f:facet name="sourceCaption">Quelle</f:facet>
                        <f:facet name="targetCaption">Ziel</f:facet>
                    </p:pickList>

                    <p:commandButton process="@this"
                        action="#{bestellungLieferantController.greet}"
                        id="auswahlSpeichern" value="Auswahl speichern"
                        oncomplete="PF('komponentenAuswahlDialog').hide();" />
            </p:dialog>
            <h:panelGrid id="paketInformationPG" columns="2" border="1">
                <f:facet name="header">
                    <h:outputText value="Paket zusammenstellen" />
                </f:facet>
                <h:outputLabel value="Kunde:" />
                <h:outputText value="#{processVariables['kunde']}" />

                <h:outputLabel value="Betriebssystem:" />
                <h:outputText value="Platzhalter" />

                <h:outputLabel value="Benutzer:" />
                <h:outputText value="#{processVariables['benutzerName']}" />
            </h:panelGrid>
            <h:panelGrid id="komponentenZusammenstellungPG" columns="2"
                border="1">
                <f:facet name="header">
                    <h:panelGrid columns="2">
                        <h:outputText value="Komponenten" />
                        <p:commandButton id="auswahlKomponenteButton"
                            action="#{bestellungLieferantController.createAvailableKomponentDualListModel()}"
                            type="button" onclick="PF('komponentenAuswahlDialog').show();"
                            value="+" />
                    </h:panelGrid>
                </f:facet>
                <p:dataTable id="komponenteTable" widgetVar="komponenteTable"
                    var="komponente"
                    value="#{bestellungLieferantController.komponentenList}">
                    <p:column>
                        <f:facet name="header">Typ</f:facet>
                        <h:outputText value="#{komponente.produkt.typ.name}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">Bezeichnung</f:facet>
                        <h:outputText value="#{komponente.produkt.name}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">SN</f:facet>
                        <h:outputText value="#{komponente.serienNummer}" />
                    </p:column>

                    <p:column headerText="Kaufdatum">
                        <f:facet name="header">Kaufdatum</f:facet>
                        <h:outputText value="#{komponente.bestellDatum}" />
                    </p:column>

                    <p:column>
                        <f:facet name="header">Aktion</f:facet>
                        <p:commandLink value="Bearbeiten" />
                        <p:commandLink value="Enfernen" />
                    </p:column>
                </p:dataTable>
            </h:panelGrid>
        </h:form>
    </h:body>
</f:view>
</html>

我的豆子:

@ManagedBean(name="bestellungLieferantController")
@SessionScoped
public class BestellungLieferantController implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 2862985625231368306L;

    @EJB
    private BestellungFacade bestellungFacade;

    @EJB
    private PaketFacade paketFacade;

    @EJB
    private KomponenteFacade komponenteFacade;

    @EJB
    private BetriebssystemFacade betriebssystemFacade;

    // Komponent-List with added komponent items
    private List<Komponente> komponentenList = new ArrayList<Komponente>();

    private DualListModel<Komponente> komponentenDualListModel;

    private static final Logger logger = Logger.getLogger(BestellungLieferantController.class);

    public DualListModel<Komponente> getKomponentenDualListModel() {
        return komponentenDualListModel;
    }

    public void setKomponentenDualListModel(DualListModel<Komponente> komponentenDualListModel) {
        this.komponentenDualListModel = komponentenDualListModel;
    }

    public List<Komponente> getKomponentenList() {
        logger.info("KomponenList-Size: " + this.komponentenList.size());
        return komponentenList;
    }

    public void setKomponentenList(List<Komponente> komponentenList) {
        logger.info("Setting a new KomponentenList...");
        this.komponentenList = komponentenList;
    }

    public void greet(){
        logger.info("Greet Method Invoked!");
    }


    /**
     * Gets the actual Model with the distinct source and 
     * @param targetList
     * @return
     */
    @PostConstruct
    public void createAvailableKomponentDualListModel(){
        // Logger

        logger.info("CreateAvailableKomponentDualList invoked!");
        List<Komponente> sourceKomponenteList = this.komponenteFacade.getAllAvailableKomponente();
        List<Komponente> sourceKomponenteDistinctList = new ArrayList<Komponente>();

        if (this.komponentenList.size() != 0){
            for(Komponente k : sourceKomponenteList){
                if (!komponentenList.contains(k)){
                    sourceKomponenteDistinctList.add(k);
                }
            }
        } else {
            sourceKomponenteDistinctList = sourceKomponenteList;
        }


//      komponentenDualListModel.setSource(sourceKomponenteDistinctList);
//      komponentenDualListModel.setTarget(komponentenList);

        this.setKomponentenDualListModel(new DualListModel<Komponente>());
        this.getKomponentenDualListModel().setSource(sourceKomponenteDistinctList);
        this.getKomponentenDualListModel().setTarget(this.komponentenList);
    }

    public void putSelectionIntoKomponenteList(){
        logger.info("PutSelectionIntoKomponentList");
        logger.info("KOMPONENTELIST: " + komponentenDualListModel.getTarget());
        this.komponentenList = this.komponentenDualListModel.getTarget();
    }
}

我的转换器:

@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {

    // Checking the converter
    private static final Logger logger = Logger.getLogger(EntityConverter.class);

    private static Map<Object, String> entities = new WeakHashMap<Object, String>();

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object entity) {
        synchronized (entities) {
            logger.info("[Converter] GetAsString: " + ", Class:" +  entity.getClass() + ", Component-ID: " + component.getId());
            if (!entities.containsKey(entity)) {
                String uuid = UUID.randomUUID().toString();
                entities.put(entity, uuid);
                return uuid;
            } else {
                return entities.get(entity);
            }
        }
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
        logger.info("[Converter] GetAsString: " + ", UUID:" +  uuid + ", Component-ID: " + component.getId());
        for (Entry<Object, String> entry : entities.entrySet()) {
            if (entry.getValue().equals(uuid)) {
                return entry.getKey();
            }
        }
        //return uuid;
        return null;
    }
}

1 个答案:

答案 0 :(得分:0)

您的actionListener代码中需要action属性而不是p:commandbutton。并在您的支持bean中使用@ViewScoped而不是@SessionScoped。并在ajax="false"

中添加p:commandButton