如何显示百里香的列表错误?

时间:2014-10-02 10:54:33

标签: java spring spring-mvc thymeleaf

以下是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);
    }
}

现在,我的问题是

  1. 如何显示这些错误,突出显示相应的字段?

  2. th:field标记中包含哪些内容?

  3. 接下来,动态添加学生记录,即学生行以前不存在,通过点击添加学生按钮,用户将能够添加学生。现在,即使th:field也必须更新。怎么做,因为它与之前完成的百日咳模板处理有关,但在页面加载后却没有?

  4. 希望你能尽快回复。

1 个答案:

答案 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;
    }
}