春季Thymeleaf表单验证被忽略

时间:2020-07-31 20:57:40

标签: forms spring-boot validation thymeleaf

我有一个我尝试验证的带有百里香形式的Spring MVC应用程序,尽管验证被忽略了(基本示例,我没有在表格中插入任何数据,然后单击“提交”。)

控制器

@GetMapping("/test")
public String getTest(Model model) {
    model.addAttribute("emailContatti", new EmailContatti());
    return "test";
}

@PostMapping("/test/validation")
public String testInputValidation(@Valid @ModelAttribute("emailContatti") EmailContatti emailContatti, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) return "contatti";
    else return "email-inviata";
}

POJO

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EmailContatti {

@NotBlank(message = "campo obbligatorio")
private String nome;

@NotBlank(message = "campo obbligatorio")
private String cognome;

@NotBlank(message = "campo obbligatorio")
@Email(message = "formato email invalido")
private String email;

@NotBlank(message = "campo obbligatorio")
@Size(min = 10, max = 13, message = "numero di telefono invalido")
private String telefono;

@NotBlank(message = "campo obbligatorio")
private String messaggio;

}

胸叶形式

<form action="#" th:action="@{/test/validation}" th:object="${emailContatti}" method="post">
<table>
    <tr>
        <td>Nome:</td>
        <td><input type="text" th:field="*{nome}" /></td>
        <td th:if="${#fields.hasErrors('nome')}" th:errors="*{nome}">Name Error</td>
    </tr>
    <tr>
        <td>Cognome:</td>
        <td><input type="text" th:field="*{cognome}" /></td>
        <td th:if="${#fields.hasErrors('cognome')}" th:errors="*{cognome}">Cognome Error</td>
    </tr>
    <tr>
        <td>Email:</td>
        <td><input type="email" th:field="*{email}" /></td>
        <td th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Email Error</td>
    </tr>
    <tr>
        <td>Numero telefono:</td>
        <td><input type="text" th:field="*{telefono}" /></td>
        <td th:if="${#fields.hasErrors('telefono')}" th:errors="*{telefono}">telefono Error</td>
    </tr>
    <tr>
        <td>Messaggio:</td>
        <td><input type="text" th:field="*{messaggio}" /></td>
        <td th:if="${#fields.hasErrors('messaggio')}" th:errors="*{messaggio}">messaggio Error</td>
    </tr>
    <tr>
        <td><button type="submit">Submit</button></td>
    </tr>
</table>

因此,如您所见,我确保将model属性添加到控制器中,确保将BindingResult插入@Valid注释之后。

结果

尽管已完全忽略了验证并显示了“成功”(invia-email)页面,但显示了表单,代码运行没有问题。

有什么想法吗?

感谢您的时间和经验

===========编辑==========

通过在bindingResult.hasErrors()处添加断点,我看到它返回false。 我也尝试过使用不同的注释验证,例如@NotNull @NotEmpty,但仍然没有运气

1 个答案:

答案 0 :(得分:0)

如果else块错误,请按如下所示更改代码:

@PostMapping("/test/validation")
public String testInputValidation(@Valid @ModelAttribute("emailContatti") EmailContatti emailContatti, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "contatti";
    }
    return "email-inviata";
}
相关问题