gpt4 book ai didi

Spring 标签
not working with Spring Data DomainClassConverter?

转载 作者:行者123 更新时间:2023-12-04 17:21:35 35 4
gpt4 key购买 nike

我正在使用 Spring MVC 和 Spring Data,并且还配置了 Spring Data 的 DomainClassConverter自动将 String id 转换为适当的域类。

我现在正在使用以下标签实现订单到客户引用:

<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 元素有一个“解决方法”,但我想知道是什么导致了这个问题。

最佳答案

请注意 org.apache.jasper.JasperException表示异常发生在 JSP 渲染期间,而不是数据绑定(bind)期间。这与异常依赖于<form:option value="" label="Select" />的事实是一致的。 - 在回发后呈现表单时处理此标记时抛出。

你观察到的行为可以解释如下:为了确定它的选中状态 <form:option>尝试将其值与绑定(bind)到 <form:select> 的字段的值进行比较.如果绑定(bind)字段的值为null , <form:option>简单地将其值与 null 进行比较,这就是为什么在初始表单呈现期间不会出现此异常的原因。否则,<form:option>尝试转换其 <value>绑定(bind)字段的类型,value = ""在这一步导致异常。

所以,你应该使用null而不是“未选择选项”值的空字符串:

<form:option value="${null}" label="Select" /> 

关于 Spring 标签 <form :option> not working with Spring Data DomainClassConverter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431993/

35 4 0