2

以下是模型:

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

4

2 回答 2

4

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

typeMismatch.java.math.BigDecimal=Required format is number.
于 2013-02-28T19:17:16.610 回答
0

我认为在这种情况下没有办法控制验证错误消息,因为它发生在调用 validate() 之前。

我们能做的就是,

  1. 定义validationError.properties
  2. 有自定义错误消息,例如
    formData.trackingNumber=Invalid Format

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

于 2013-02-27T04:52:24.200 回答