以下是模型:
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页面上使用的表单对象的类名还是名称?