我正在使用 Spring MVC 和 Spring Data,并且还配置了 Spring DataDomainClassConverter
以自动将 String id 转换为适当的 Domain 类。
我现在正在使用以下标签实现 Order to Customer 参考:
<form:select path="customer">
<form:option value="" label="Select" />
<form:options items="${customers}" itemValue="id" />
</form:select>
这导致给定的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>
当提交选择客户 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!
这根本没有意义,因为收到的值应该是 1 而不是 ''。我还调试了收到的请求参数,它只包含 customer=1 (如预期的那样)
请注意,它InvalidDataAccessApiUsageException
来自 Spring Data DomainClassConverter
,如果我删除了这个转换器,问题就不会再发生了。
我还调试了DomainClassConverter
它,我可以看到它试图覆盖两次。首先使用字符串值 1(如预期的那样),然后使用空字符串进行另一个调用,导致异常。
然而它变得更奇怪了......
当我<form:option value="" label="Select" />
用普通的 html 元素替换时<option value="">Select</option>
,不会发生异常,因此只使用字符串 1 对 convert 方法进行 1 次调用。奇怪的部分是两者都<form:option value="" label="Select" />
产生<option value="">Select</option>
相同的 html 输出......
我无法解释这种行为......虽然我似乎有一个使用普通 html 元素的“解决方法”,但我想知道是什么导致了这个问题。