以下是DTO对象的示例骨架。
public class MyDTO
{
List<Student> students=new ArrayList<>();
}
public class Student
{
String name;
Integer age;
// setter and getter methods
}
现在,用户有机会将大量学生输入列表,任何学生详细信息都可能包含错误。可能的错误是学生年龄大于25岁,姓名包含特殊字符等。
例如,students[2].name
有一个特殊字符student[4].age
&gt; 25,那他们就是错误。现在,我想在这些字段下面显示错误,并突出显示相应的字段。
<form th:field="${myDTO}">
<input type="text" th:field="*{students[0].name}" th:errorclass="fieldError"/>
<span class="error" th:if="${#fields.hasErrors('students[0].name')}" th:errors="*{students[0].name}"></span>
<input type="number" th:field="*{students[0].age}" min="15" max="25" th:errorclass="fieldError"/>
<span class="error" th:if="${#fields.hasErrors('students[0].age')}" th:errors="*{students[0].age}"></span>
</form>
我对th:field
属性中的内容感到困惑?当我如上所述写作时,结果就是这种错误
BindingResult和bean名称都没有普通的目标对象 &#39;学生+&#39; [&#39; 0 +&#39;]&#39;&#39;可用作请求属性。
在我的验证器中,我有这种类型的代码..
int idx=0;
for(Student st: students)
{
errors.pushNestedPath("students["+idx+"]");
ValidationUtils.invokeValidator(studentValidator, st, errors);
errors.popNestedPath();
idx++;
}
并在StudentValidator
班..
@Override
public void validate(Object obj, Errors errors) {
Student s=(Student) obj;
if(containsSpecialCharacters(s.name))
{
errors.rejectValue("name","name.containsSpecialCharacters",null,null);
}
if(s.age>25 || s.age<15)
{
errors.rejectValue("age","age.invalid",null,null);
}
}
现在,我的问题是
如何显示这些错误,突出显示相应的字段?
th:field
标记中包含哪些内容?
接下来,动态添加学生记录,即学生行以前不存在,通过点击添加学生按钮,用户将能够添加学生。现在,即使th:field
也必须更新。怎么做,因为它与之前完成的百日咳模板处理有关,但在页面加载后却没有?
希望你能尽快回复。
答案 0 :(得分:0)
您的验证似乎是正确的,但也许您需要在控制器中传递BindingResult
作为参数,以便可以在视图层中检索错误。
@PostMapping("/students")
public String saveStudent(@Valid Student, BindingResult bindingResult, RedirectAttributes redirAttrs) {
if (bindingResult.hasErrors()) {
// Show errors here
bindingResult.getAllErrors().stream().forEach(System.out::println);
return "student-edit";
} else {
Long id = releaseLogService.save(student).getId();
redirAttrs.addFlashAttribute("message", "Success");
return "redirect:/student/edit/" + id;
}
}