【发布时间】:2012-09-08 01:26:12
【问题描述】:
我正在使用 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>
生成给定的 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(如预期的那样),然后使用空字符串进行另一个调用,导致异常。
但它变得更奇怪了......
当我用纯 html 元素 <option value="">Select</option> 替换 <form:option value="" label="Select" /> 时,不会发生异常,因此只有 1 次调用使用字符串 1 的转换方法。
奇怪的是<form:option value="" label="Select" /> 和<option value="">Select</option> 产生相同的html 输出...
我无法解释这种行为......虽然我似乎有一个使用普通 html 元素的“解决方法”,但我想知道是什么导致了这个问题。
【问题讨论】:
标签: spring spring-mvc spring-data spring-data-jpa