手动将 FieldError 添加到 bindingResult 时,Spring 表单输入值丢失

yel*_*ver 2 java spring jsp spring-mvc spring-form

我在 Spring MVC 中有一个 web 控制器:

@RequestMapping("/")
public String create(@Valid @ModelAttribute Device device, BindingResult bindingResult) {
    return getDefaultView();
}
Run Code Online (Sandbox Code Playgroud)

jsp视图:

<form:form role="form" commandName="device">
    <form:input path="name" class="form-control"/>
    <form:errors path="name" cssClass="text-danger"/>
    <button type="submit">Submit</button>
</form:form>
Run Code Online (Sandbox Code Playgroud)

假设我的 Device 类只有一个属性name。我想验证它(示例长度 >= 5)

public class DeviceDTO {
    @Size(min = 5)
    String name;
    //getter & setter..
}
Run Code Online (Sandbox Code Playgroud)

运行后,我在名称字段中输入字符串“abc”然后提交,表单将显示为: 在此处输入图片说明

我们可以看到有旧值和错误消息。但在某些情况下,我想用我自己的标准手动验证(该注释无法处理),我删除 @Size 注释并像这样更改我的控制器:

@RequestMapping("/")
public String create(@Valid @ModelAttribute Device device, BindingResult bindingResult) {
    if(device.getName().length() < 6)
        bindingResult.addError(new FieldError("device", "name", "custom error"));
    return getDefaultView();
}
Run Code Online (Sandbox Code Playgroud)

但是现在,当我使用“abc”值提交表单时,会显示我的自定义错误,但我的name字段的旧值没有 在此处输入图片说明

但是如果我直接使用 ${device.name},它仍然显示“abc”值。

GUI*_*sam 6

试试下面的代码:

@RequestMapping("/")
public String create(@Valid @ModelAttribute Device device, BindingResult bindingResult) {
    if(device.getName().length() < 6)
        bindingResult.addError(new FieldError("device", "name",device.getName(), false, null, null, "custom error"));
    return getDefaultView();
}
Run Code Online (Sandbox Code Playgroud)