2016-12-06 4 views
0

Ну, я работаю над простым проектом с весенним mvc и спящим режимом, и все работает нормально на данный момент, но есть кое-что, что я не могу понять почему это происходит в моем коде. У меня есть страница JSP с пользовательской формой и списком ролейЯ не верну свой объект должным образом в свой ModelAttribute после заполнения формы

вот мой код формы с пружинной формой:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
    . 
    . 
    . 
    <form:form action="saveUser" method="POST" modelAttribute="user"> 
       <label>First name:</label> 
       <form:input path="firstName"/> 
       <br><br> 
       <label>Last name:</label> 
       <form:input path="lastName"/> 
       <br><br> 
       <label>Email:</label> 
       <form:input path="email"/> 
       <br><br> 
       <label>Login:</label> 
       <form:input path="login"/> 
       <br><br> 
       <label>Password:</label> 
       <form:password path="pwd" /> 
       <br><br> 
       <label>Role:</label> 
       <form:select path="role"> 
        <form:options items="${roles}" itemLabel="description" itemValue="id_role" /> 
       </form:select> 
       <br><br> 
      <input class="add-button" type="submit" value="Add" /> 
     </form:form> 
     . 
     . 

Хорошо, поэтому, когда я представляю, образую я ловлю его на моем Контроллер Я правильно получаю свой «пользовательский» объект, который был заполнен, НО объект «роль» не был. Например, я выбрал роль «administrator» с ID = 2 и DESCRIPTION = «administrator», поэтому, когда я его получу, я просто найду что-то вроде этого {ID = 0, DESCRIPTION = 2}!

@RequestMapping("/saveUser") 
public String saveUser(@ModelAttribute("user") User user) { 
    System.out.println(user.getRole()); // its gives => [id = 0, description = 2] 
    int roleId = Integer.parseInt(user.getRole().getDescription()); // normally here I have to write user.getRole().getId() but you know that the id came inside description :(
    Role r = roleService.getById(roleId); 
    user.setRole(r); 
    userService.save(user); 
    return "redirect:/user/list"; 
} 

Его дует мой разум .. спасибо за помощь мне

Update

Вот Роль и RoleServiceImpl

Role.java

@Entity @Table(name = "ROLES") 
public class Role { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id_role; 

    private String description; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "role") 
    private List<User> users; 

    public Role() { 

    } 

    public Role(String description) { 
     super(); 
     this.description = description; 
    } 

    public Role(String description, List<User> users) { 
     super(); 
     this.description = description; 
     this.users = users; 
    } 

    public int getId_role() { 
     return id_role; 
    } 

public void setId_role(int id_role) { 
    this.id_role = id_role; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

public List<User> getUsers() { 
    return users; 
} 

public void setUsers(List<User> users) { 
    this.users = users; 
} 

@Override 
public String toString() { 
    return "Role [id=" + id_role + ", description=" + description + "]"; 
} 
} 

RoleServiceImpl .java

@Service 
public class RoleServiceImpl implements IService<Role> { 

@Autowired 
private IDAO<Role> roleDAO; 

@Override 
@Transactional 
public List<Role> getAll() { 
    return roleDAO.getAll(); 
} 

@Override 
@Transactional 
public void save(Role role) { 
    roleDAO.save(role); 
} 

@Override 
@Transactional 
public Role getById(int roleId) { 
    return (Role) roleDAO.getById(roleId); 
} 

@Override 
@Transactional 
public void delete(int roleId) { 
    roleDAO.delete(roleId); 
} 
} 

Update Мой roleDAO: @Repository общественного класса RoleDAOImpl реализует IDAO {

@Autowired 
SessionFactory sessionFactory; 

@Override 
public List<Role> getAll() { 
    Session session = sessionFactory.getCurrentSession(); 
    List<Role> roles = 
      session.createQuery("from Role order by description", Role.class) 
      .getResultList(); 
    return roles; 
} 


@Override 
public Role getById(int roleId) { 
    Session session = sessionFactory.getCurrentSession(); 
    Role role = session.get(Role.class, roleId); 
    return role; 
} 

@Override 
public void save(Role role) { 
    Session session = sessionFactory.getCurrentSession(); 
    session.saveOrUpdate(role); 
} 

@Override 
public void delete(int roleId) { 
    Session session = sessionFactory.getCurrentSession(); 
    Query query = session.createQuery("delete from Role where id=:roleId"); 
    query.setParameter("roleId", roleId); 
    query.executeUpdate(); 
} 

}

+0

как вы построить список ролей? –

+0

Hey @IssamELATIF Im, создавая его следующим образом: '@RequestMapping ("/addForm ") public String addUser (модель) { Пользователь user = new Пользователь(); Список role = roleService.getAll(); model.addAttribute («пользователь», пользователь); model.addAttribute («роли», роли); вернуть «пользователей/добавить»; } ' – amine1401

+0

Ваш код кажется правильным для меня. Я не знаю, почему у вас такое поведение! Я даю вашему коду попытку, и это сработало для меня. Если эта проблема повторяется, попробуйте использовать карту вместо списка. См. Мой ответ –

ответ

0

Ваш код кажется правильным для меня. Я не знаю, почему у вас такое поведение!
Если использование списка не работает, попробуйте использовать карту.

Map<String, String> roles = roleService.getAll(); 

roleService.getAll() должен возвращать карту <ID,Description> с ролью ID в качестве ключа и роли Описания в качестве значения.

Затем используйте форму: варианты, как этот

<form:select path="role"> 
    <form:options items="${roles}" /> 
</form:select> 

Finaly вы можете получить роль Id user.getRole().getId()

Смежные вопросы