Форма Thymeleaf не может обрабатывать org.bson. Тип документа - PullRequest
0 голосов
/ 24 мая 2018

У меня есть класс сущности с полями типа org.bson.Document.Это значения, которые мне не разрешено изменять, но при использовании Spring Data мне необходимо отобразить их в моем классе модели, чтобы после сохранения документа обратно в Mongo эти значения не были потеряны.Таким образом, документ извлекается из Mongo, отображается в User POJO и затем передается в форму Thymeleaf.Когда я пытаюсь отправить форму Thymeleaf обратно в контроллер, я получаю 400 ошибочных запросов «Ошибка проверки для объекта ...», и я знаю, что это из-за этих двух дополнительных полей 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;
}

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я решил это, создав пользовательский 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());
    }
0 голосов
/ 24 мая 2018

Звучит так, как будто объект успешно внедряется в шаблон Thymeleaf, но неправильно анализируется в Spring при возвращении формы.

Вы должны проверить представление на веб-странице (ожидая json?) Изатем убедитесь, что в Spring определен обработчик, который может успешно десериализовать возвращаемый объект.

Если тип Document не имеет обычного конструктора (no-args или all-args) или некоторые поля«скрытый» (без стандартных методов getXxx и setXxx), тогда Spring не сможет восстановить объект, когда форма отправлена ​​без пользовательского обработчика.

Аналогично, если для всехПоля (и подполя) объекта, в шаблон Thymeleaf будет встроен неполный объект, который будет загружаться некорректно.

Посмотрите эту запись блога для получения дополнительной информации: https://www.rainerhahnekamp.com/en/spring-mvc-json-serialization/

...