Java Spring-如何在listbox jsp中获取对象列表

Java Spring-如何在listbox jsp中获取对象列表,java,spring,forms,hibernate,jsp,Java,Spring,Forms,Hibernate,Jsp,我不明白为什么当我在jsp文件中提交spring表单时,我可以得到一个对象角色列表,但没有一个被填充(id,roleName)。 我的表单允许创建一个新用户,并且一个用户可以有多个角色 这是我的模型用户 @Entity public class User implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String username; privat

我不明白为什么当我在jsp文件中提交spring表单时,我可以得到一个对象角色列表,但没有一个被填充(id,roleName)。 我的表单允许创建一个新用户,并且一个用户可以有多个角色

这是我的模型用户

@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;
//......}
@实体
公共类用户实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串用户名;
私有字符串密码;
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinTable(name=“userandrole”,
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“role\u id”))
私有列表角色;
@枚举(EnumType.STRING)
私有用户状态;
@许多酮
@JoinTable(name=“userandpartenaire”,
joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“partenaire\u id”))
私人合伙人;
//......}
这是我的榜样

@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;
//..... }
@实体
公共阶级角色{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串roleName;
@ManyToMany(mappedBy=“roles”,fetch=FetchType.EAGER)
私人名单用户;
//..... }
这是我的控制器。首先,向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";

}
@RequestMapping(“/gestionAdmin”)
公共字符串设置窗体(映射){
//System.out.println(fonction.hasRole(“Partenaire”);
用户=新用户();
user.setRoles(新的AutoPopulatingList(Role.class));
List usersList=userService.getAllUsers();
初始化(usersList);
map.put(“用户”,user);
map.put(“usersList”,usersList);
put(“rolesList”,roleService.getAlltRoles());
返回“手势管理员”;
}
JSP文件

<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>

用户名
密码
角色
地位
最后是我的爱好,可以采取信息的形式。这里有一个错误NullPointerException,因为我试图在对象用户中获取角色的角色名id(在for循环中查找syso)

@RequestMapping(value=“/gestionAdmin.do”,method=RequestMethod.POST)
公共字符串setupFormAdmin(@ModelAttribute(“用户”)@有效用户用户、BindingResult结果、映射映射、@RequestParam字符串操作){
System.out.println(fonction.hasRole(“Partenaire”);
用户=新用户();
User usersTest=userService.findUserByName(User.getUsername());
User usersTestId=userService.findUser(User.getId());
List roleList=new ArrayList();
字符串消息=”;
//System.out.println(“ooooo”+user.getPassword());
if(fonction.hasRole(“Admin”)){
开关(action.toLowerCase()){
案例“添加”:
字符串mdp=user.getPassword();
user.setPassword(fonction.encode(mdp));
System.out.println(user.getRoles().size());//这里我的getRole大小大于0
for(角色:user.getRoles()){
//roleList.add(roleService.findRole(1));
System.out.println(role.getRoleName()+“”+role.getId()+“”;//错误NullPointerException
}
user.setRoles(角色列表);
if(usersTest==null){
userService.addUser(用户);
}否则{
messages=“利用德加·普雷丹基地”;
}
打破
谢谢 (对不起我的英语)

我找到了解决办法

在控制器中,我添加了一个@InitBinder角色

@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;
        }
    });
}
在表格中,我添加了itemsValue

<form:select path="roles" multiple="true" items="${rolesList}" itemLabel="roleName" itemValue="id">

我找到了解决办法

在控制器中,我添加了一个@InitBinder角色

@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;
        }
    });
}
在表格中,我添加了itemsValue

<form:select path="roles" multiple="true" items="${rolesList}" itemLabel="roleName" itemValue="id">