首页 > 解决方案 > Thymeleaf 表单无法处理 org.bson.Document 类型

问题描述

我有一个带有 type 字段的实体类org.bson.Document。这些是我不允许修改的值,但是在使用 Spring Data 时,我需要将它们映射到我的模型类中,以便在将文档保存回 Mongo 后,这些值不会丢失。因此,从 Mongo 获取文档,映射到UserPOJO,然后传递到 Thymeleaf 表单。当我尝试将 Thymeleaf 表单发送回控制器时,我收到 400 Bad Request "Validation failed for object..." 错误,我知道这是因为这两个附加Document字段。如何将这些字段传递给 Thymeleaf,然后返回给控制器?它们没有在表单中修改,只是显示为隐藏输入:

<input id="resetPassword" th:field="${user.resetPassword}" type="hidden"/>
<input id="consents" th:field="${user.consents}" type="hidden"/>

我的User班级:

@Data
@Document(collection = "users")
@NoArgsConstructor
public class User {

    @Id
    private ObjectId id;

    private String email;
    private String name;
    private String surname;
    private String phone;
    private String password;
    private String country;
    private SecurityLevel securityLevel = SecurityLevel.LOW;
    private Timestamp created = Timestamp.from(Instant.now());
    private Boolean blocked = false;

    private org.bson.Document resetPassword;
    private org.bson.Document consents;
}

标签: javaspringthymeleafspring-data-mongodb

解决方案


我通过创建这样的自定义来解决它Formatter

public class BsonDocumentFormatter implements Formatter<Document> {

    @Override
    public Document parse(String s, Locale locale) throws ParseException {

        return Document.parse(s);
    }

    @Override
    public String print(Document document, Locale locale) {

        return document.toJson();
    }
}

然后我在我的WebMvcConfigureruration

@Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new BsonDocumentFormatter());
    }

推荐阅读