p:selectManyCheckbox:将所选值输入bean

时间:2014-05-25 12:27:11

标签: spring jsf java-ee web primefaces

我想将一个用户列表分配给一个项目,然后我的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;
    }

screentshot: enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:0)

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

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

如果您希望在Primeface Datatable上基于Checkbox进行多项选择,则无需使用显式h:selectManyCheckbox

您可以通过在第一个/最后一个selectionMode="multiple"上指定p:column属性来实现此目的。

请参阅Primefaces Showcase

答案 1 :(得分:0)

这是entityConverter:

@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;
    }

}