【发布时间】:2013-02-27 04:06:02
【问题描述】:
以下是模型:
public class myFormData {
private BigDecimal trackingNumber;
@Valid
private List<myCustomRecord> records = new ArrayList<myCustomRecord>();
}
public class myCustomRecord {
//the field also appears here (for child records)
private BigDecimal trackingNumber;
}
我有一个控制器方法,它在某个时候接收此对象以进行保存。
public @ResponseBody ValidationResponse save(Model model,
@Valid myFormData formData, BindingResult result,
HttpSession session){
//do stuff
}
我遇到的问题是,如果将字符串传递到 trackingNumber 字段中,错误消息就不好了。
无法将类型“java.lang.String”的属性值转换为属性“records[0].trackingNumber”所需的类型“java.math.BigDecimal”;嵌套异常是 java.lang.NumberFormatException
未能将类型“java.lang.String”的属性值转换为属性“trackingNumber”所需的类型“java.math.BigDecimal”;嵌套异常是 java.lang.NumberFormatException
另一个潜在的复杂情况是我没有使用 Spring 表单,因为我正在尝试进行一些 ajax 提交。这就是我提交数据的方式:
function collectFormData(fields) {
var data = {};
//myFormData
data["trackingNumber"] = <<some value here>>;
for (var i = 0; i < fields.length; i++) {
data["records["+i+"].trackingNumber"] = <<some value>>;
//some more data to submit for child records
}
return data;
}
var mData = collectFormData(aSelectedRows);
if (aSelectedRows.length> 0) {
$.post('call_controller_save', mData, function(response) {
if (response.status === 'FAIL') {
displayError(response);
} else {
//SAVE SUCCESSFUL
$('#successMsgs').append("Data Saved");
}, 'json');
}
我尝试将trackingNumber 的数据类型更改为String 并编写了自定义ConstraintValidator<CheckNumeric, String>。它可以解决问题...我可以通过ValidationMessages.properties 输入自定义消息,但我想让模型保持对预期数据类型的真实性。 是否有其他方法可以控制错误消息并将其变成漂亮且用户友好的内容?
(我也知道NumberFormatException 最有可能发生在数据绑定中,在验证步骤之前?但我仍然不确定如何修复默认消息)
编辑 我使用如下配置
<bean class="org.springframework.context.support.ResourceBundleMessageSource"
id="messageSource">
<property name="basenames">
<list>
<value>messages</value>
<value>ValidationMessages</value>
</list>
</property>
</bean>
在每个属性文件中,我都有相同的内容。
formData.trackingNumber=Invalid format
但自定义消息仍未收到。 问题2:应该是formData还是myFormData?我很困惑是jsp页面上使用的表单对象的类名还是名称?
【问题讨论】:
标签: spring hibernate bean-validation hibernate-validator