带有 Thymeleaf th:object 的 Spring Boot 使用具有现有值的对象而不覆盖它们

Posted

技术标签:

【中文标题】带有 Thymeleaf th:object 的 Spring Boot 使用具有现有值的对象而不覆盖它们【英文标题】:Spring boot with Thymeleaf th:object use an object with existing values without overriding them 【发布时间】:2015-12-14 17:05:51 【问题描述】:

我正在尝试使用我的实体类User 作为表单对象。

@Entity
@Table(name = "users")
public class User implements Serializable 

    @Column(unique = true, nullable = false)
    @Id
    private int id;

    @Column(name = "username")
    private String username;

    @Column(name = "created_at", nullable = false)
    private Timestamp createdAt;

    // Other variables, getters and setters...

观点:

<form th:action="@/users/id/save(id=$user.id)" th:method="POST" th:object="$user">
<label for="username">Vartotojo vardas</label>
<input type="text" id="username" name="username" th:value="$user.username" th:field="*username"/>
<button type="submit" class="btn btn-success" th:text="Saugoti"></button>
</form>

现在,当我显示包含该表单的页面时,我传递了一个名为“user”的对象以在th:value 中使用。

我想要实现什么? 用户包含一个名为createdAt 的字段在提交表单后它变为空,即使它之前不为空(我在表单之前的视图中打印出来确认)。我希望表单不会更改我没有告诉它更改的值。

【问题讨论】:

【参考方案1】:

一个简单的解决方案是将 createdAt 字段作为隐藏字段添加到表单中,并填充其值。

也许更好的解决方案是使用数据传输对象,该对象仅包含您希望以这种特定形式更新的字段。这样您就可以确保您想要更新的字段会被更新,而您想要单独留下的字段将是单独的。

【讨论】:

在这种情况下,无论如何使用对象没有多大意义......我可以为我的控制器中的每个字段添加@RequestParam。 使用 DTO 对象仍然允许您在表单字段上使用基于注释的验证 当然可以,但最终我不会真正赢得太多,因为我必须将数据从 DTO 传输到我的实体。 是的,但您确保不能通过将其他用户字段包含在表单帖子中来简单地更改它们。

以上是关于带有 Thymeleaf th:object 的 Spring Boot 使用具有现有值的对象而不覆盖它们的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf---基础知识

Spring+thymeleaf

Thymeleaf模板引擎语法

Thymeleaf 整理

Thymeleaf th:each 用 th:if 过滤

Thymeleaf下拉菜单