Проблема с созданием формы для вложенного объекта с помощью Thymeleaf - PullRequest
0 голосов
/ 19 мая 2019

Я создаю приложение MVC, используя Spring Boot 2 и Thymeleaf .

У меня возникли проблемы с созданием формы для сложного объекта.Я получил свой класс MedicalJournalEntry, который содержит некоторые примитивные атрибуты, а также вложенный объект класса BloodPressure (ассоциация).Здесь вы можете увидеть оба класса:

Класс MedicalJournalEntry:

@Entity
@Table(name="MED_JOURNAL_ENTRY")
public class MedicalJournalEntry extends JournalEntry{


/*
 * The following attributes are inherited from the superclass JournalEntry
 * intJournalEntryId
 * datJournalEntryDate
 * tstmpJournalEntryCreateDate
 * tstmpJournalEntryUpdateDate
 * 
 * getters and setters are defined and implemented in the superclass JournalEntry as well
 * 
 */
@Embedded
private BloodPressure bloodPressure;

@ManyToOne
@JoinColumn(name = "JOURNAL_ID")
@JsonBackReference
private MedicalJournal medJournal; // bidirectional relationship with entity MedicalJournal

@Column(name="JOURNAL_ENTRY_PULSE")
private short shPulse; 
@Column(name="JOURNAL_ENTRY_HEIGHT")
@Min(value = 1, message="Die Größe muss größer als 1cm sein.")
@Max(value = 300, message="Die Größe muss kleiner als 300cm sein.")
private short shHeight; // in centimeters
@Column(name="JOURNAL_ENTRY_WEIGHT")
@Min(value = 1, message="Das Gewicht muss größer als 1kg sein.")
@Max(value = 500, message="Das Gewicht muss kleiner als 500kg sein.")
private short shWeight; // in kilograms
@Column(name="JOURNAL_ENTRY_BMI")
private float fltBmi;
@Column(name="JOURNAL_ENTRY_IS_SICK")
private boolean blnIsSick;

// constructors and methods ...
}

Класс BloodPressure:

@Embeddable // is part of MedicalJournalEntry
public class BloodPressure {

public BloodPressure(int intSYS, int intDIA) {
    this.intSYS = intSYS;
    this.intDIA = intDIA;
}
@Column(name ="BLOOD_PRESSURE_SYS")
private int intSYS;
@Column(name = "BLOOD_PRESSURE_DIA")
private int intDIA;
// constructors and mehtods ...
}

Я создал форму, используя фрагмент.Это работает очень хорошо для «нормальных» полей, но так как я добавил поля вложенных объектов, Thymeleaf даже не может создать представление, которое больше хранит форму.Я всегда получаю следующую ошибку, когда хочу показать форму:

Ошибка при выполнении процессора

org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor '(template: "create-medJournalEntry "

Моя форма листа тимьяна выглядит следующим образом:

    <form action = "#" th:action="@{/medJourEntry/add}" th:object=${medicalJournalEntry} method ="post">

    <div th:replace="edit-medJournalEntry.html :: medEntryForm(medEntry=${#object})"></div>


    <button type="submit" class="btn btn-primary">Tagebucheintrag erstellen</button>

    <button type="reset" class="btn btn-primary">Felder zurücksetzen</button>

    </form>

И соответствующее содержимое фрагмента, вызывающее проблемы:

        </div>

            <div class ="form-row">

                <div class="form-group col-md-4">

                    <label for="bloodpressureSys">Blutdruck systolisch</label>

                    <input type="text" th:field="*{bloodPressure.intSys}" class="form-control" id="bloodpressureSys" aria-describedby="bloodpressureSystHelp" placeholder="Systolischer Blutdruck">

                    <div th:if="${#fields.hasErrors('${medicalJournalEntry.bloodPressure.intSys}')}">
                        <div class="alert alert-danger" role="alert">
                            <p th:each="err : ${#fields.errors('bloodPressure.intSys')}" th:text="${err}"></p>
                        </div>
                    </div>

                    <small id="bloodpressureSystHelp" class="form-text text-muted">Bitte tragen Sie den systolischen Blutdruck (in mmHg) ein.</small>

                </div>

            <div class="form-group col-md-4">

                    <label for="bloodpressureDia">Blutdruck Diastolisch</label>

                    <input type = "text" th:field="*{bloodPressure.intDia}" class="form-control" id="bloodpressureDia" aria-describedby="bloodpressureDiaHelp" placeholder="Diastolischer Blutdruck">

                    <small id="bloodpressureDiaHelp" class="form-text text-muted">Bitte tragen Sie den diastolischen Blutdruck (in mmHg) ein.</small>

            </div>
        </div>

Это мойКонтроллер. Он возвращает только представление, которое содержит форму ввода данных для нового MedicalJournalEntry:

@RequestMapping(value="/create", method = RequestMethod.GET)
public String showCreateMedicalJournalEntryForm(MedicalJournalEntry medicalJournalEntry) {

    return "create-medJournalEntry";
}

1 Ответ

0 голосов
/ 22 мая 2019

Спасибо за всех, кто пытается мне помочь!

Мы только что выяснили нашу проблему.

В конструкторе без аргументов класса MedicalJournalEntry отсутствовала конструкция пустого объекта BloodPressure. Это обязательно, потому что в противном случае вы получите какое-то исключение NullPointerException, потому что дочерний объект просто не жив.

Итак, проблема исправлена. Спасибо всем еще раз, очень ценю это! :)

...