Using POJO's with SelectOneMenu with Generic Converter

前端 未结 2 1561
我寻月下人不归
我寻月下人不归 2021-01-03 06:28

Hello How to use List of POJO\'s with JSF h:selectOneMenu or Primefaces p:selectOneMenu?
I know that there are lot of related questions which s

2条回答
  •  星月不相逢
    2021-01-03 06:52

    In h:selectOneMenu it's possible, but yours POJO must implements a interface with a identifier atrribute.

    Interface:

    public inteface IConvertible {
        public Integer getId();
    }
    

    Pojo:

    public class POJO implements IConvertible {
        ....
        ....
    }
    

    And generic converter:

    @SuppressWarnings("unchecked")
    public class GenericConverter implements Converter {
    
        @Override
        public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
            IConvertible ret = null;
            UIComponent src = arg1;
            if (src != null) {
                List childs = src.getChildren();
                UISelectItems itens = null;
                if (childs != null) {
                    for (UIComponent ui : childs) {
                        if (ui instanceof UISelectItems) {
                            itens = (UISelectItems) ui;
                            break;
                        } else if (ui instanceof UISelectItem) {
                            UISelectItem item = (UISelectItem) ui;
                            try {
                                IConvertible val = (IConvertible) item.getItemValue();
                                if (arg2.equals("" + val.getId())) {
                                    ret = val;
                                    break;
                                }
                            } catch (Exception e) {
                            }
                        }
                    }
                }
    
                if (itens != null) {
                    List values = (List) itens.getValue();
                    if (values != null) {
                        for (IConvertible val : values) {
                            if (arg2.equals("" + val.getId())) {
                                ret = val;
                                break;
                            }
                        }
                    }
                }
            }
            return ret;
        }
    
        @Override
        public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
            String ret = "";
            if (arg2 != null && arg2 instanceof IConvertible) {
                IConvertible m = (IConvertible) arg2;
                if (m != null) {
                    Long id = m.getId();
                    if (id != null) {
                        ret = id.toString();
                    }
                }
            }
            return ret;
        }
    }
    

    JSF page:

    
        
        
    
    

提交回复
热议问题