PrimeFaces选项列表目标未填充

时间:2013-01-26 06:03:38

标签: jsf-2 primefaces

我在对话框中实现了PrimeFaces选项列表。每次显示对话框时,选取列表的目标内容都应根据之前显示的列表条目而改变。在打开对话框之前,我使用适当的值填充ProdukteBean.onEditProdukt(..)中的选项列表的目标。不幸的是,这些目标值不会显示在目标容器中。以下是相关的代码:

list.xhtml:

<p:commandLink id="editButton" update=":dialogForm:editDialogPanel" title="Edit" 
    oncomplete="produktDialog.show();" 
    process="@this" partialSubmit="true"
    action="#{produkteBean.onEditProdukt}">
            <h:outputText value="Bearbeiten" /> 
            <f:setPropertyActionListener value="#{p}" target="#{produkteBean.produkt}" /> 
</p:commandLink>

dialog.xhtml:

<!-- ... -->
<p:dialog id="dialog" header="Produkt-Details" widgetVar="produktDialog" appendToBody="true" showEffect="explode" hideEffect="explode"  modal="true" width="500"> 
<p:messages id="msgs"/> 
        <h:form id="dialogForm"> 
            <!-- ... -->
            <p:pickList id="produkteDatenList" var="proddat" value="#{produkteBean.datenList}"
        itemLabel="#{proddat.bezeichnung}" itemValue="#{proddat}" 
        converter="produktDatConverter"/> 
            <!-- ... -->
        </h:form>
</p:dialog>

ProdukteBean.java:

    @Named("produkteBean")
    @ViewScoped // @SessionScoped // @ViewScoped
    public class ProdukteBean implements Serializable {

        @Inject @Transient private ProdukteService produkteService; 
        @Inject @Transient private DatenService datenService; 

        @Inject()
        private ProdukteDatenBean produkteDatenBean;

        private DualListModel<Dat> datenList = new DualListModel<Dat>();  

        private Dat dat = null;

        public ProdukteBean() {

        }

        @PostConstruct
        private void init() {

            getAll();
        }

        private void getAll() {
            logger.debug("getAll()");
            getAllProdukte();
            getAllDaten();
        }

        private void getAllDaten() {
            logger.debug("getAllDaten()");

            List<Dat> source = new ArrayList<Dat>();
            source.addAll(datenService.list());

            List<Dat> target = new ArrayList<Dat>();
            if (produkt.getDaten() != null) {
                logger.debug("adding " + produkt.getDaten().size() + " daten to produkt " + produkt.getName());
                target.addAll(produkt.getDaten());
            }       

            DualListModel<Dat> datenList = new DualListModel<Dat>();  
            datenList.setSource(source);
            datenList.setTarget(target);
            setDatenList(datenList);
        }

        public List<Produkt> getAllProdukte() {
            logger.debug("getAllProdukte()");
            return produkteService.list();
        }

        public void onEditProdukt() {

            onEditProdukt(null);
        }

        public void onEditProdukt(ActionEvent actionEvent) {

            logger.debug("onEditProdukt: " + ReflectionToStringBuilder.toString(produkt));
            if (produkt != null) {
                setSelectedEinheit(produkt.getEinheit());
                getAllDaten();
            }
            FacesMessage msg = new FacesMessage("Produkt ausgewählt", produkt.getName());  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
        }

        /**
         * @return the einheitList
         */
        public List<Einheit> getEinheitList() {

            if (einheitList == null) {
                einheitList = produkteService.getEinheiten();
            }
            return einheitList;
        }

    }

ProduktDatConverter.java:

@FacesConverter(forClass=Dat.class,value="produktDatConverter")
@ViewScoped
public class ProduktDatConverter implements Converter {

@Inject
@Transient DatenService datenService;

@Transient
protected final Logger logger = Logger.getLogger(getClass().getName());

    // gets never called (of course)
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String str) {
       logger.debug("getAsObject(): " + str);
       return null;
    }

public String getAsString(FacesContext arg0, UIComponent arg1, Object object) {
   if (object instanceof Dat) {
            // logger.debug("   returning id " + String.valueOf(((Dat) object).getId()));
        return Long.toString(((Dat) object).getId());
   }
   return null;
}
}

有什么想法吗?非常感谢提前!

2 个答案:

答案 0 :(得分:0)

您在CDI Managed Bean中使用@ViewScoped。将其更改为JSF Managed Bean。更好的是,使用CODI代替

另见:

答案 1 :(得分:0)

我认为这是converter + injection问题。请单击here并参阅BalusC答案。您也可以尝试替换:

@FacesConverter(forClass=Dat.class,value="produktDatConverter")

@ViewScoped

@ManagedBean

@RequestScoped

并像这样调用转换器: converter="#{produktDatConverter}"