当前位置: 首页 > 知识库问答 >
问题:

列表字段中实体的Thymeleaf bean验证

卓宏达
2023-03-14

我正在使用Springboot和Thyemleaf,试图用javax验证我的表单数据。验证。约束注释。

在我的模板中,我使用了一个Thyem立夫命令对象,它是我的模型类Quiz。在模型中,我有一些经过验证的字段-

@NotBlank(message = "Title must not be blank")
private String title;

@NotBlank(message = "Text must not be blank")
private String text;

@NotNull
@Size(min = 2, max = 6, message = "Must be at least two, no more than six options")
private List<Option> options = new ArrayList<>(); // for Thymeleaf form

这是用于输入文本/标题的超文本标记语言-

<form th:action="@{/create}" th:object="${quiz}" method="post">
            <div class="flex-column">
                <label>Title</label>
                <textarea type="text" class="form-control" th:field="*{title}" rows="1"></textarea>
                <div class="error" th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Error</div>
            </div>
            <div class="flex-column">
                <label>Question</label>
                <textarea type="text" class="form-control" th:field="*{text}" rows="2"></textarea>
                <div class="error" th:if="${#fields.hasErrors('text')}" th:errors="*{text}">Error</div>
            </div>

以下是提交表单时endpoint的控制器-

@RequestMapping(value = "/create", params = {"save"})
public String saveQuizFromForm(@Valid final Quiz quiz, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
        for (Option option : quiz.getOptions()) {
            System.out.println("Option is empty? " + option.getOption().isEmpty());
        }
        bindingResult.getAllErrors().forEach(System.out::println);
        log.info("Binding result error: {}", quiz);
        return "create";
    }
    log.info("Quiz form submitted: {}", quiz); // todo save quiz to db
    return "welcome"; // todo return form submitted result
}

在我的模板中,我可以提交表单,如果titletext为空并且插入了带有消息的新div,bindingResult将返回字段错误。

Field error in object 'quiz' on field 'text': rejected value []; codes [NotBlank.quiz.text,NotBlank.text,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [quiz.text,text]; arguments []; default message [text]]; default message [Text must not be blank]

我遇到字段列表问题

@Entity(name = "options_table")
public class Option {

    @NotEmpty(message = "Must enter an option")
    private String option;

<代码>bindingResult。getAllErrors()不会在这个models字段上返回错误,尽管输入为空,正如我在controller选项中选中的那样。getOption()。isEmpty()返回true。

这是我用来尝试显示错误的HTML-

<div th:each="option, rowStat : *{options}">
    <input type="text" th:field="*{options[__${rowStat.index}__].option}">
    <ul th:if="${#fields.hasErrors('${quiz.options[__${rowStat.index}__].option}')}">
        <li
            class="error"
            th:each="err : 
                ${#fields.errors('${quiz.options[__${rowStat.index}__].option}')}"
            th:text="${err}">
                Input is incorrect
        </li>
    </ul>
</div>

我也试过了

th:if="${#fields.hasErrors('*{options[__${rowStat.index}__].option}')}"
th:each="err : ${#fields.errors('*{options[__${rowStat.index}__].option}')}"

我没有收到任何异常,但也没有创建任何错误。

我在这里检查了这个非常类似的问题,但它并没有解决问题。我的构建中有Spring Boot starter验证依赖项。gradle文件<代码>实施组织。springframework。启动:spring boot starter验证“

共有1个答案

欧阳英彦
2023-03-14

我在模型测验的字段中添加了有效的注释。这会递归检查已验证的对象并修复我的错误。

    @NotNull
    @OneToMany(mappedBy = "quiz", cascade = CascadeType.ALL)
    @JsonManagedReference
    @Valid
    @Size(min = 2, max = 6, message = "Must be at least two, no more than six options")
    private List<Option> options = new ArrayList<>();
 类似资料:
  • 问题内容: 我问这个问题有点傻,但是我找不到这个问题的简单答案。 以这个简单的实体为例: 它代表一个人,因此我想添加一个“ 性别 ”属性。 这将是“男性”或“女性”。所以呢? 我可以使用String,并要记住,“ m”代表男性,“ f”代表女性。 或者,我可以使用布尔值“ isMale”(是或否)。 但是,我认为无论哪种情况,Hibernate纯粹主义者都不会高兴:) 仔细搜索一下,我发现最佳实践

  • 所以首先我为我不可靠的解释道歉。我的PHP技能需要认真改进。 错误消息表示“”未知。我知道这不是真的,因为当我创建一个名为“”的变量并回显前者时,我会得到编号。 以下是完整的错误消息: 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42S22]:未找到列:C:\xampp\htdocs\loginregister master\addnew中的“字段列表”中的1054

  • 我需要帮助。 使用方法时,在HQL中出现错误: 我猜他必须写而不是 可能是我做错了实体和关系吗? 2个实体-房屋和街道 ER模型: 餐桌街道 ID 名称 houses_id 桌房 ID 名称 我的类: 街道 房屋 我的道小鬼: StreetDaoImp: HouseDaoImpl: 错误:

  • 即使我在表中设置了关系和定义了外键,我得到这个错误的原因是什么?

  • 我有一个名为User的域对象: 我有相关的DTO(UserDTO),它是 我想使用Dozer从域对象转换为DTO。Profile类有一个属性 我想要的是Dozer为列表中的每个配置文件获取配置文件的id并将其保存在DTO的列表中。我可以做这样的事情吗?我必须使用自定义转换器吗? 这是我的实际映射文件

  • 问题内容: 我在此代码中隔离了我的问题。运行它时,出现错误: [查询3中的错误]“字段列表”中的未知列“ purchase_date” 有人知道吗? 问题答案: 语句之间和中插入了一个不可打印的字符30(RecordSeparator)。只需删除文本,然后手工重写就可以了。