java - Spring - How to get list of object in listbox jsp -
i don't understand why, when submit spring form in jsp file, can list of object role none filled (id,rolename). form allows create new user , user can have multiple roles.
here model user
@entity public class user implements serializable{ @id @generatedvalue(strategy=generationtype.auto) private int id; private string username; private string password; @manytomany(fetch = fetchtype.eager,cascade = cascadetype.all) @jointable(name="userandrole", joincolumns=@joincolumn(name="user_id"), inversejoincolumns=@joincolumn(name="role_id")) private list<role> roles; @enumerated(enumtype.string) private userstatus status; @manytoone @jointable(name="userandpartenaire", joincolumns=@joincolumn(name="user_id"), inversejoincolumns=@joincolumn(name="partenaire_id")) private partenaire partenaires; //......}
here model role
@entity public class role { @id @generatedvalue(strategy=generationtype.auto) private int id; private string rolename; @manytomany(mappedby = "roles",fetch = fetchtype.eager) private list<user> users; //..... }
here controler. first send user , list of role jsp
@requestmapping("/gestionadmin") public string setupform(map<string, object> map){ //system.out.println(fonction.hasrole("partenaire")); user user = new user(); user.setroles(new autopopulatinglist<role>(role.class)); list<user> userslist = userservice.getallusers(); hibernate.initialize(userslist); map.put("user", user); map.put("userslist",userslist ); map.put("roleslist", roleservice.getalltroles()); return "gestionadmin"; }
jsp file
<form:form action="gestionadmin.do" method="post" commandname="user"> <table> <tr> <td>username</td> <td><form:input path="username" /></td> </tr> <tr> <td>password</td> <td><form:input path="password" /></td> </tr> <tr> <td>roles</td> <td><form:select path="roles" multiple="true" items="${roleslist}" itemlabel="rolename"> </form:select> </td> </tr> <tr> <td>status</td> <td><form:select path="status"> <form:option value="active" label="active"/> <form:option value="inactive" label="inactive"/> </form:select> </td> </tr> <tr> <td> <input type="submit" name="action" value="search" /> <input type="submit" name="action" value="add" /> <input type="submit" name="action" value="update" /> </td> </tr> </table> </form:form>
and fonction can take form information. , here have error nullpointerexception because try id rolename of role in object user ( syso in loop)
@requestmapping(value="/gestionadmin.do", method=requestmethod.post) public string setupformadmin(@modelattribute("user") @valid user user,bindingresult result,map<string, object> map,@requestparam string action){ system.out.println(fonction.hasrole("partenaire")); user users = new user(); user userstest = userservice.finduserbyname(user.getusername()); user userstestid = userservice.finduser(user.getid()); list<role> rolelist = new arraylist<role>(); string messages=""; //system.out.println("ooooo" + user.getpassword()); if( fonction.hasrole("admin")){ switch (action.tolowercase()) { case "add": string mdp = user.getpassword(); user.setpassword(fonction.encode(mdp)); system.out.println(user.getroles().size()); // here size of getrole > 0 (role role : user.getroles()) { //rolelist.add(roleservice.findrole(1)); system.out.println(role.getrolename() + " "+ role.getid()+"); // error nullpointerexcepction } user.setroles(rolelist); if(userstest==null){ userservice.adduser(user); }else{ messages="utilisateur déja présent dans la base de donné"; } break;
thanks (sorry english )
i find solution
in controller add @initbinder of role
@initbinder protected void initbinder(httpservletrequest request, servletrequestdatabinder binder) throws exception { // super.initbinder(request, binder); binder.registercustomeditor(list.class, "roles",new customcollectioneditor(list.class){ @override protected object convertelement(object element) { role role = new role(); if (element != null && (element.tostring().equals("1") || element.tostring().equals("2") || element.tostring().equals("3") || element.tostring().equals("4"))) { role.setid(integer.parseint(element.tostring())); } return role; } }); }
and in form add itemsvalue
<form:select path="roles" multiple="true" items="${roleslist}" itemlabel="rolename" itemvalue="id">
Comments
Post a Comment