【问题标题】:How to display list errors in thymeleaf?如何在百里香中显示列表错误?
【发布时间】:2014-10-02 10:54:33
【问题描述】:

这是 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>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 属性中添加什么感到困惑?当我像上面那样写时,结果就是这种类型的错误

Bean 名称的 BindingResult 和普通目标对象都不是 'students+'['+0+']'' 可用作请求属性。

在我的验证器中,我有这种类型的代码..

    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. 接下来,学生记录是动态添加的,也就是之前不存在的学生行,点击Add student按钮,用户就可以添加学生了。现在,即使th:field 也必须更新。怎么做,因为它与之前完成但不是在页面加载后完成的thymeleaf模板处理有关?

希望您尽快回复。

【问题讨论】:

    标签: java spring spring-mvc thymeleaf


    【解决方案1】:

    您的验证似乎是正确的,但也许您需要在控制器中传递 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 2016-08-14
      • 2021-01-09
      • 2020-12-30
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多