0

ダイアログに 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>

製品Bean.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;
        }

    }

製品DatConverter.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;
}
}

何か案は?よろしくお願いします!

4

2 に答える 2

0

@ViewScopedCDI Managed Bean とともに使用しています。JSF マネージド Bean に変更します。代わりにCODIを使用することをお勧めします

以下も参照してください。

于 2013-01-26T09:10:02.853 に答える
0

converter+injection問題だと思います。ここをクリックて、BalusC の回答を参照してください。次のものを置き換えることもできます。

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

@ViewScoped

@ManagedBean

@RequestScoped

次のようにコンバーターを呼び出します。 converter="#{produktDatConverter}"

于 2013-01-26T10:46:01.923 に答える