Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Spring形式绑定多个关联_Spring_Spring Mvc_Data Binding_Spring Form - Fatal编程技术网

用Spring形式绑定多个关联

用Spring形式绑定多个关联,spring,spring-mvc,data-binding,spring-form,Spring,Spring Mvc,Data Binding,Spring Form,我有一个公司实体,该实体与确认实体有多个关联 @Entity public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column private int id; @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "company_acknowledgement", joinColumn

我有一个
公司
实体,该实体与
确认
实体有
多个
关联

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

    ...
}
和我的JSP文件(视图)


姓名:
保存更改
我尝试了各种方法,上面就是其中之一,但我似乎不知道如何做到这一点。那么,在提交表单时,我如何将所选确认映射到我的
公司
实体中的关联


提前非常感谢

在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}" />

为什么不编写自定义请求参数解析器? 例如,实现接口HandlerMethodArgumentResolver (更多:)


在“ResolveRagument”方法中(基于带所有参数的请求),您可以使用选定的确认来构建公司实体。

首先,您需要在控制器中加载确认的完整列表,并将其放入模型中(比如确认列表)。简单地载入公司只会载入campany的确认,而不是完整的列表

然后在jsp中:

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

您似乎缺少
公司和
实体上的
equals
hashCode
方法的实现

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

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

这些人有完整的答案:

这看起来不错,直到我提交POST请求,其中绑定对象时出现以下异常:
org.springframework.beans.InvalidPropertyException:bean类[com.example.company.entity.company]的无效属性“Acknowledges[0]:无法从大小为0的集合中获取索引为0的元素,使用属性路径“确认[0]”访问。
您必须将设置更改为列表以确认,因为设置没有索引。此外,该集合的大小似乎为0。请确保确认已从companyService.get(companyId)加载;方法,正如我看到的,它懒散地加载在实体类中。很抱歉,没有尽快回复您。我将字段更改为
java.util.List
(运行时
org.hibernate.collection.internal.PersistentBag
),但结果相同。集合确实是从调用我的服务的数据库中获取的。点击
doEdit
controller操作时会发生错误,此时在绑定到对象时集合尚未初始化。我没有理解您。您的意思是说这是延迟加载问题吗?我的意思是,在呈现编辑页面(编辑控制器操作)时不会出现该问题。在那里,确认被很好地加载,因为它们已经通过调用我的服务中的
get
方法加载了。当过帐到
doEdit
控制器操作时会出现问题-更具体地说,当过帐数据绑定到
company
参数时。我不完全确定,但我的猜测是,在对象绑定期间,我用复选框选择的索引将尝试在集合上查找,但此时集合为空。我希望这有帮助。
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"  />
<form:checkboxes path="acknowledgements" items="${acknowledgementList}" itemValue="id" itemLabel="name"/>