Mar*_*ijk 1 spring spring-mvc spring-data spring-data-jpa
我正在使用Spring MVC和Spring Data,并且还配置了Spring Data DomainClassConverter来自动将String id转换为适当的Domain类.
我现在使用标签实现Order to Customer参考:
<form:select path="customer">
<form:option value="" label="Select" />
<form:options items="${customers}" itemValue="id" />
</form:select>
Run Code Online (Sandbox Code Playgroud)
这导致给定的HTML:
<select id="customer" name="customer" class="span6">
<option value="">Select</option>
<option value="1">Customer A</option>
<option value="2">Customer B</option>
<option value="3">Customer C</option>
</select>
Run Code Online (Sandbox Code Playgroud)
当提交例如客户A的帖子时,我会得到一个例外:
org.apache.jasper.JasperException: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull @javax.persistence.ManyToOne nl.kapsalonreflection.domain.Customer for value ''; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!
Run Code Online (Sandbox Code Playgroud)
这根本没有意义,因为收到的价值应该是1而不是''.我还调试了收到的请求参数,它只包含customer = 1(如预期的那样)
请注意,InvalidDataAccessApiUsageException它来自Spring Data DomainClassConverter,如果我删除了这个转换器,问题就不再发生了.
我也调试了DomainClassConverter,我可以看到它试图覆盖两次.首先使用String值1(如预期的那样),然后使用空String进行另一次调用,从而导致异常.
它虽然变得怪异......
当我<form:option value="" label="Select" />用普通的html元素替换时,<option value="">Select</option>异常不会发生,因此只用String 1对convert方法进行了1次调用.奇怪的是,两者<form:option value="" label="Select" />和<option value="">Select</option>产品都是相同的html输出...
我无法解释这种行为......虽然我看到有一个普通html元素的"解决方法",但我想知道是什么导致了这个问题.
请注意,org.apache.jasper.JasperException表示在JSP呈现期间发生异常,而不是在数据绑定期间发生.它与异常依赖的事实一致<form:option value="" label="Select" />- 在回发后呈现表单时处理此标记时抛出它.
您观察到的行为可以解释如下:为了确定其选择状态,<form:option>尝试将其值与绑定到的字段的值进行比较<form:select>.如果绑定字段的值是null,<form:option>只需将其值与其进行比较null,这就是在初始表单呈现期间不会出现此异常的原因.否则,<form:option>尝试将其转换<value>为绑定字段的类型,并value = ""在此步骤中导致异常.
因此,您应该使用null"无选项选择"值代替空字符串:
<form:option value="${null}" label="Select" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3913 次 |
| 最近记录: |