从Spring Form下拉菜单中选择Java Object

时间:2016-12-21 13:07:14

标签: java spring hibernate spring-mvc spring-form

是否可以从Spring Form的下拉菜单中选择整个Java Object?我使用了LinkedHashMap,但它不起作用。

我在表代理和表角色之间存在多对一关系(每个代理都有一个角色,例如用户,管理员)。我使用hibernate所以我必须操作Object,而不是数据库中的Id。我的问题是我想创建下拉菜单,其中包含我数据库中所有角色的列表,当我选择一个元素时,此Object将转到我的代理对象并保存在我的数据库中。

我有我的角色对象列表

List<Roles> rolesList = rolesService.getAllRoles();

由此产生:

public List<Roles> getAllRoles() {
    return session().createQuery("from Roles").list();
}

我试过这样的事情:

在我的AgentController中:

@RequestMapping("/createagent")
public String createAgent(Model model) {
    Agent agent = new Agent();
    List<Roles> rolesList = rolesService.getAllRoles();
    Map<Roles, String> rolesMap = new LinkedHashMap<Roles,String>();
    for (int i=0; i<rolesList.size(); i++){
        rolesMap.put(rolesList.get(i), rolesList.get(i).getRole());
    }
    model.addAttribute("rolesMap", rolesMap);
    model.addAttribute("agent", agent);
    return "createagent";
}

在我的jsp文件中:

<tr><td>Roles:</td><td>
<sf:select path="roles" multiple="false">
<sf:options items="${rolesMap}"></sf:options>
</sf:select>
</td></tr> 

我的角色对象:

@Entity
@Table(name = "roles")
public class Roles {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "roles_seq_gen")
@SequenceGenerator(name = "roles_seq_gen", sequenceName = "roles_id_seq")
@Column(name = "id")
private long id;

@Column(name = "role")
private String role;

它显示了我想要的东西但是当我在下拉菜单中单击位置并提交它时,我的表单不能正确保存我的对象。它嵌套了......我不知道如何订阅它,也许我的toString()函数输出清楚一点。

Agent [id=0, username=TestUsername, password=TestPassword, roles=Roles[id=0, roles=Roles[id=0, roles=user]] ...

我的代理对象:

 @Entity
 @Table(name="agent")
 public class Agent {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="agent_seq_gen")
    @SequenceGenerator(name="agent_seq_gen", sequenceName="agent_id_seq")
    @Column(name="id")
    private long id;

    @Column(name="username")
    private String username;

    @Column(name="password")
    private String password;

    @ManyToOne
    @JoinColumn(name="roles_id")
    private Roles roles;

我的jUnit测试运行正常,我的Spring Form或控制器出了问题......我不知道。

1 个答案:

答案 0 :(得分:0)

我建议使用ModelAttribute并将表单对象引用到所述属性,例如agent.getRoles()

createAgent(@ModelAttribute("agent") Agent agent)应该适用于您要完成的任务。