【问题标题】:PrimeFaces picklist target not populatedPrimeFaces 选项列表目标未填充
【发布时间】:2013-01-10 03:46:58
【问题描述】:

我正在对话框中实现 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;
}
}

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

【问题讨论】:

  • 请删除不必要的代码。
  • 好的,删除了不必要的代码。对不起。
  • datenList 属性是否已正确创建到支持 bean 中?调试它并检查是否设置了正确的值,您将能够隔离问题。

标签: jsf-2 primefaces


【解决方案1】:

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

另见:

【讨论】:

    【解决方案2】:

    我想这是converter + injection 的问题。请点击 here 并参考 BalusC 的答案。也可以尝试替换:

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

    @ViewScoped

    与

    @ManagedBean

    @RequestScoped

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

    【讨论】:

    • 谢谢。我尝试了这一点,并将所有 @Named 注释更改为 @ManagedBean 并将 @Inject 注释更改为 @ManagedProperty 我还仔细检查了支持 bean 值是否就位并且它们是。不幸的是它仍然不起作用......
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多