【问题标题】:p:selectManyCheckbox : getting the selected value into beanp:selectManyCheckbox : 将选中的值放入 bean
【发布时间】:2014-07-14 08:24:40
【问题描述】:

我想为一个项目分配一个用户列表,那么我的 xhtml 是这样的:

            <p:dataTable id="dta" value="#{UtilisateurComponent.listUtilisateurs()}"  var="current" rows="15" paginator="true" paginatorPosition="bottom">
                <p:column>
                    <h:selectManyCheckbox id="selectUser" value="#{ProjetComponent.projet.utilisateurs}"   >
                        <f:selectItem  var="utilisateurs" value="#{utilisateurs.iduser}" itemLabel=""/>
                        <f:converter converterId="entityConverter" />
                    </h:selectManyCheckbox>
                </p:column>

            </p:dataTable>

        </h:panelGrid>
        <h:panelGroup>
                    <p:commandButton image="save" ajax="false" style="margin-right:20px;" value="#{projetmsgs['navigation.save']}" action="#{ProjetComponent.saveProjetUtilisateurs1(ProjetComponent.projet,ProjetComponent.projet.utilisateurs)}"/>
            </h:panelGroup>
</p:panel>

这是ProjetComponent中保存的方法:

private Projet projet;
    private Utilisateur utilisateurs;
    @Autowired
    private ProjetDAO projetDAO;
    @Autowired
    private UtilisateurDAO utilisateurDAO;
    @Autowired
    private ProjetService projetService;
    @Transactional
    public String saveProjetUtilisateurs1(Projet p, List<Utilisateur> utilisateur) {
        projet = projetService.saveProjetUtilisateurs(p, utilisateur);
        return "/jsf/projet/viewProjet.xhtml";
    }

这个方法保存在组件ProjetCompnent调用的ProjetService类中:

@Transactional
public Projet saveProjetUtilisateurs(Projet projet,List<Utilisateur> ut)
{

    projet.setAvancement(projet.getAvancement());
    projet.setConfidentialite(projet.getConfidentialite());
    projet.setDatedebut(projet.getDatedebut());
    projet.setDatefineffective(projet.getDatefineffective());
    projet.setDatefinprevu(projet.getDatefinprevu());
    projet.setDescription(projet.getDescription());
    projet.setDurreprojet(projet.getDurreprojet());
    projet.setNomprojet(projet.getNomprojet());
    projet.setObjectifprojet(projet.getObjectifprojet());
    projet.setStatut(projet.getStatut());
    projet.setUtilisateurs(ut);

    projet = projetDAO.store(projet);
    projetDAO.flush();
    return projet;
}

这是 Projet 实体:

@Entity
public class Projet implements Serializable {
        @Id
        private Integer idprojet;
    @ManyToMany(mappedBy = "projets", fetch = FetchType.LAZY)
    java.util.List<com.gestion.projet.domain.Utilisateur> utilisateurs;
    }

截图:

问题是得到一个空的用户列表:

【问题讨论】:

    标签: spring jsf jakarta-ee web primefaces


    【解决方案1】:

    尝试在h:selectManyCheckbox 上使用p:ajax

    <p:ajax event="change" process="@this" />
    

    如果您希望在 Primeface 数据表上使用基于复选框的多选,则无需使用显式 h:selectManyCheckbox

    您可以通过在第一个/最后一个 p:column 上指定 selectionMode="multiple" 属性来做到这一点。

    请参阅Primefaces Showcase

    【讨论】:

    • 我有同样的问题 selectionMode="multiple"
    • 然后在p:dataTable 本身上使用p:ajax&lt;p:ajax event="rowSelect" /&gt;。如果问题仍然存在,那么您的entityConverter 中可能存在问题。
    【解决方案2】:

    这是实体转换器:

    @FacesConverter(value = "entityConverter")
    public class EntityConverter implements Converter {
    
        private static Map<Object, String> entities = new WeakHashMap<Object, String>();
    
    
        public String getAsString(FacesContext context, UIComponent component, Object entity) {
            synchronized (entities) {
                if (!entities.containsKey(entity)) {
                    String uuid = UUID.randomUUID().toString();
                    entities.put(entity, uuid);
                    return uuid;
                } else {
                    return entities.get(entity);
                }
            }
        }
    
    
        public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
            for (Entry<Object, String> entry : entities.entrySet()) {
                if (entry.getValue().equals(uuid)) {
                    return entry.getKey();
                }
            }
            return null;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 2014-12-01
      • 2016-03-24
      • 1970-01-01
      • 2015-01-18
      • 2013-07-06
      相关资源
      最近更新 更多