将ManyToMany与Spring Form绑定

时间:2015-01-27 12:38:37

标签: spring spring-mvc data-binding spring-form

我有一个与Company实体有ManyToMany关联的Acknowledgement实体。

@Entity
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private int id;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "company_acknowledgement", joinColumns = @JoinColumn(name = "company_id"), inverseJoinColumns = @JoinColumn(name = "acknowledgement_id"))
    @OrderBy("name")
    private Set<Acknowledgement> acknowledgements = new HashSet<>();

    ...
}

@Entity
public class Acknowledgement {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private int id;

    @Column(length = 50, nullable = false)
    private String name;

    ...
}

在表单中,我希望能够选择一些应该绑定到Company实体的确认(带复选框)。因此,当我将带有POST的表单提交给我的控制器操作时,我的Company对象包含许多Acknowledgement个对象。

我尝试将HashSet更改为TreeSet as discussed in this question,但没有运气。已检查的Acknowledgement对象将始终存在于我的数据库中,因此基本上我只需填充每个对象的id字段。

这是我的控制器代码:

@Controller
public class CompanyController {
    @Autowired
    private CompanyService companyService;

    @RequestMapping("/company/edit/{companyId}")
    public String edit(Model model, @PathVariable int companyId) {
        Company company = this.companyService.get(companyId);
        model.addAttribute("company", company);

        return "company-edit";
    }

    @RequestMapping(value = "/company/edit", method = RequestMethod.POST)
    public String doEdit(Model model, Company company) {
        return ""; // TODO: persist company
    }
}

我的JSP文件(查看)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<c:url var="actionUrl" value="/company/edit" />

<form:form action="${actionUrl}" commandName="company">
    <form:label path="name">Name:</form:label>
    <form:input path="name" />

    <%-- Other inputs here --%>

    <input type="checkbox" name="acknowledgements[]" value="1" />
    <input type="checkbox" name="acknowledgements[]" value="2" />

    <form:button>Save Changes</form:button>
</form:form>

我尝试了各种各样的东西,上面就是其中之一,但我似乎无法弄清楚如何做到这一点。那么,在提交表单时,如何将选定的确认映射到Company实体中的关联?

非常感谢你!

4 个答案:

答案 0 :(得分:0)

在你的jsp中,你需要迭代循环,如下所示。

<c:forEach items="${company.acknowledgements}" var="ack" varStatus="count">
    <input type="checkbox" name="acknowledgements[${count.index}].name" value="${ack.name}" />
 </c:forEach> 

编辑: 你能试试复选框

吗?
<form:checkboxes path="acknowledgements" items="${company.acknowledgements}" />

答案 1 :(得分:0)

为什么不编写自定义请求参数解析器? 例如,实现接口HandlerMethodArgumentResolver (更多:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodArgumentResolver.html)。

in&#39; resolverArgument&#39;方法(基于所有参数的请求)您可以使用选定的确认构建公司实体。

答案 2 :(得分:0)

首先,您需要在控制器中加载完整的确认列表并将其放入模型中(假设为acknowledgementList)。只需加载公司只会加载该公司的确认,而不是完整列表。

然后在jsp:

<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"  />

答案 3 :(得分:0)

您的equalshashCode实体似乎缺少实施CompanyAcknowledgement方法。

在你的jsp中,你只需编写如下代码:

<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"/>

这些家伙有完整的答案: https://stackoverflow.com/a/8718318/3846688