Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC表单验证:如何使字段可选?_Java_Spring_Spring Mvc_Validation - Fatal编程技术网

Java SpringMVC表单验证:如何使字段可选?

Java SpringMVC表单验证:如何使字段可选?,java,spring,spring-mvc,validation,Java,Spring,Spring Mvc,Validation,我有一个表单(Spring3MVC项目),我正在使用DTO(数据传输对象)进行数据验证。数据被发送到控制器,我正在使用BindingResult.hasErrors()方法和适当的注释检查它的有效性。这里我要简化一下,因为我对数字字段有问题 DTO: public class Item { private String discount; @Digits(integer = 15, fraction = 2) public String getDiscount() {

我有一个表单(Spring3MVC项目),我正在使用DTO(数据传输对象)进行数据验证。数据被发送到控制器,我正在使用
BindingResult.hasErrors()
方法和适当的注释检查它的有效性。这里我要简化一下,因为我对数字字段有问题

DTO:

public class Item {

    private String discount;

    @Digits(integer = 15, fraction = 2)
    public String getDiscount() {
        return discount;
    }

}
如果我提交表单时未在
折扣
字段中写入任何内容,
BindingResult.hasErrors()
将返回true并显示消息

数值超出范围(.expected)


我想实现的是,
折扣
字段可以为空,但如果其中写入了内容,则应采用由
@Digits
注释提供的数字格式。我如何才能做到这一点?

您可以创建自定义验证注释。在Spring文档中可以找到一个解释:PAR5.7.2.2

< P>您需要做的是配置Spring将<强>空字符串转换为<强> null 。您可以通过在FormController
initBinder
方法中注册
StringTrimmerEditor
来实现这一点:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}


然后按PARSIFAL指定,<代码> @数字>代码>考虑<代码> null <代码>值为ValID.< /P>根据JavaDoc,<代码> @ DigiS//C>应接受空值,空表单字段通常被翻译为NULL。我还没有证实这一点,但我希望他们已经测试过这个案例。我会在没有约束的情况下运行一个测试,以验证我没有在字段中得到意外的结果(可能是由于某些转换器作为请求堆栈的一部分运行)。若字段是空的,我得到的是空字符串。