更改/清除验证错误时的表单值

Joh*_*anB 1 spring spring-mvc thymeleaf spring-boot

我正在创建一个 html 页面,其中的表单只包含一个字段:cardId. 用户需要使用读卡器(类似键盘的输入)填写此字段。当cardId验证失败时,用户可以重试(例如不完整的读取)。当然,这只有在先前输入被清除的情况下才有可能。

我在我的 gradle 构建中使用以下依赖项

compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
Run Code Online (Sandbox Code Playgroud)

两个请求映射:

@RequestMapping(value = "/search", method = RequestMethod.GET)
public String cardSearch(CardSearch cardSearch) {
    return "search";
}

@RequestMapping(value = "/search", method = RequestMethod.POST)
public String cardResult(@Valid CardSearch cardSearch, BindingResult result, Model model) {

    if(result.hasErrors()) {
        return "search";
    } else {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

表单对象

public class CardSearch {
    @CustomValidator(message = "Card not found...")
    private String cardId;

    Getter and setter
}
Run Code Online (Sandbox Code Playgroud)

我正在使用自定义验证器来验证 cardId

@Override
public boolean isValid(String cardField, ConstraintValidatorContext cxt) {
    Card card = find card by cardField;

    if(card == null) {
        return false;
    } else {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

形式

<div th:errors="${cardSearch.cardId}"></div>
<form action="#" th:action="@{search}" th:object="${cardSearch}" method="post">
   <input type="text" th:field="*{cardId}" autofocus="autofocus" size="50" showPassword="true" />
</form>
Run Code Online (Sandbox Code Playgroud)

当验证失败时,会向用户显示错误消息,但错误的 cardId 在输入字段中。一种可能的解决方案是使用密码输入字段(浏览器清除输入),但随后输入被屏蔽。有什么更好的方法来清除cardId

[编辑] 添加了 github 示例https://github.com/JohanBas/FormReset

小智 5

其实我有一个类似的问题,但反过来。如果发生错误,我希望我的值不会被删除。我也在使用th:field,它现在对我有用。

即使在使用@Valid 之后,我也需要使用new FieldError手动添加字段错误。

因此,如果您这样做,该字段的值不会被清除:

bindingResult.addError(
   new FieldError("formObject", "field", formObject.getField(), true, null, null, 
                  messageSource.getMessage("you.fail", null , Locale.getDefault())));
Run Code Online (Sandbox Code Playgroud)

如果您这样做,该字段的值将被清除:

bindingResult.addError(new FieldError("formObject", "field", 
                  messageSource.getMessage("you.fail", null , Locale.getDefault())));
Run Code Online (Sandbox Code Playgroud)

见的构造FieldError尤其是一个与rejectedValue

 /**
 * Create a new FieldError instance.
 * @param objectName the name of the affected object
 * @param field the affected field of the object
 * @param rejectedValue the rejected field value
 * @param bindingFailure whether this error represents a binding failure
 * (like a type mismatch); else, it is a validation failure
 * @param codes the codes to be used to resolve this message
 * @param arguments the array of arguments to be used to resolve this message
 * @param defaultMessage the default message to be used to resolve this message
 */
public FieldError(
        String objectName, String field, Object rejectedValue, boolean bindingFailure,
        String[] codes, Object[] arguments, String defaultMessage) {
Run Code Online (Sandbox Code Playgroud)