如何自定义BigDecimal的默认消息

时间:2013-02-27 04:06:03

标签: spring hibernate bean-validation hibernate-validator

以下是模型:

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

2 个答案:

答案 0 :(得分:4)

添加到验证消息 - 如果Spring无法从提供的文本转换为数字,则默认使用这种格式:

typeMismatch.java.math.BigDecimal=Required format is number.

答案 1 :(得分:0)

我认为在调用validate()之前,有一种方法可以控制验证错误消息。

我们能做的就是,

  1. 定义validationError.properties
  2. 有自定义错误消息,如
    formData.trackingNumber =格式无效

  3. 为org.springframework.context.support.ResourceBundleMessageSource类定义一个spring bean,其中p:basename为validationError

相关问题