Версия Spring Framework 3.1.4
Вопрос??? Существует ли какой-либо способ динамического изменения объекта улавливания формы в зависимости от некоторых критериев.
Его очень сложно объяснить, я сделаю все возможное здесь
У меня есть Java Object PatientDocument.java
public class PatientDocument{
@Id
protected String documentId;
@Indexed
protected String patientId;
@Indexed
protected Integer documentType;
protected Object document;
}
Поле document
в выше классе может иметь любые объекты типов данных в зависимости от значения в поле documentType
Например: если DocumentType равен 1, то объект, представляющий "документ" поля будет MedicalCertificate.Java
и я хранить PatientDocument в коллекцию MongoDB.
MedicalCertificate.java
выглядит
public class MedicalCertificate {
protected String complaint;
protected String suggestedRestingDays;
protected Integer treatingDoctor;
protected Integer medicalDirector;
}
Я использую Thymeleaf для моей клиентской обработки
Мой пациентDocument.html выглядит
<form action="#" id="patientDocument" th:action="@{/emr/patient/document/save}" th:object="${patientDocument}" method="post" class="form-horizontal">
<!-- #### HIDDEN FIELDS #### -->
<input type="hidden" th:field="*{documentId}" class="col-xs-12" readonly="readonly"/>
<input type="hidden" th:field="*{documentType}" class="col-xs-12" readonly="readonly"/>
<input type="hidden" th:field="*{patientId}" class="col-xs-12" readonly="readonly"/>
<!-- Medical Certificate -->
<section th:if="${patientDocument.documentType == 1}" layout:include="@{emr/patient/medicalCertificate} :: main"></section>
<!-- Referal Letter -->
<section th:if="${patientDocument.documentType == 2}" layout:include="@{emr/patient/referalLetter} :: main"></section>
<!-- Acknowledgment Form -->
<section th:if="${patientDocument.documentType == 3}" layout:include="@{emr/patient/acknowledgeForm} :: main"></section>
<form>
medicalCertificate.html выглядит
<section layout:fragment="main">
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-xs-2">Complaint</label>
<div class="col-xs-10">
<textarea rows="5" th:field="*{document.complaint}" class="col-xs-12"></textarea>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-xs-4">Rest For</label>
<div class="col-xs-8">
<input type="text" th:field="*{document.suggestedRestingDays}" class="col-xs-12"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-xs-4">Treated By</label>
<div class="col-xs-8">
<input type="hidden" th:field="*{document.treatingDoctor}" readonly="readonly"/>
<input type="text" th:field="*{document.treatingDoctorName}" class="form-control"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-xs-4">Medical Director</label>
<div class="col-xs-8">
<input type="hidden" th:field="*{document.medicalDirector}" readonly="readonly"/>
<input type="text" th:field="*{document.medicalDirectorName}" class="form-control"/>
</div>
</div>
</div>
</div>
</section>
@RequestMapping(value="/document/save", method=RequestMethod.POST)
public String savePatientDocument(@ModelAttribute PatientDocument patientDocument, Model model, HttpServletRequest request){
logger.debug("Executing save for Patient Document : {}", patientDocument.toString());
////Logic to the Service Layer
}
Объяснение Вопросов: поскольку вы можете видеть, что patientDocument.html
содержимое формы стороны клиента, соответствующее "документу" поля, будет заменено фрагментами Thymeleaf в зависимости от поля documentType. Поэтому, когда я отправляю форму в контроллер просмотра, объект DocumentDocument содержит поля MedicalCertificate вместо поля "document". Все в порядке !!!
Теперь в диспетчере представлений мне нужно передать обработчику сообщения, что "Привет, объект PatientDocument.java
приходит как PatientDocument.java
формы. Но объектом внутри поля" document "будет" MedicalCertificate.java ""
Где я могу это указать? Есть ли способ сделать это в SPRING MVC??
Мне нужно изменить объект patientDocument.java
как patientDocument.java
ниже, перед patientDocument.java
на получение клиентской стороны. Но как?
PatientDocument patientDocument = new PatientDocument();
patientDocument.setDocument(new MedicalCertificate());
заранее спасибо
Хорошего дня
Вариант 1: измените класс контейнера на:
public class PatientDocument{
@Id
protected String documentId;
@Indexed
protected String patientId;
@Indexed
protected Integer documentType;
protected AcknowledgeForm acknowledgeForm;
protected MedicalCertificate medicalCertificate;
protected ReferalLetter referalLetter;
}
Затем поля формы в medicalCertificate.html
будут выглядеть так:
<textarea rows="5" th:field="*{medicalCertificate.complaint}" class="col-xs-12"></textarea>
<input type="text" th:field="*{medicalCertificate.suggestedRestingDays}" class="col-xs-12"/>
<input type="hidden" th:field="*{medicalCertificate.treatingDoctor}" readonly="readonly"/>
<input type="text" th:field="*{medicalCertificate.treatingDoctorName}" class="form-control"/>
Вам придется внести аналогичные изменения в другие формы. Затем вы можете прочитать требуемое свойство PatientDocument
на основе его типа documentType
.
Вариант 2: Напишите PropertyEditor
для PatientDocument
для анализа запроса и установки документа на основе параметров запроса.
propertyEeditor
в этом случае. Извините за поздний ответ.
PropertyEditor
который получает полный запрос HttpServletRequest
чтобы он мог исследовать каждое поле формы. Затем PropertyEditor
создаст объект на основе информации, найденной в отправленной форме. Проблема в том, что реализация PropertyEditor
вы предоставите, будет подклассом java.beans.PropertyEditorSupport
, который не зависит от HttpServletRequest
. Таким образом, нет простого примера реализации варианта 2. Вам нужно будет просмотреть документацию Spring MVC, чтобы разработать собственное решение.