#java #spring #spring-boot #controller #dto
#java #весна #spring-boot #контроллер #dto
Вопрос:
В моем проекте я получаю значения из пользовательского интерфейса, передаю на контроллер и на уровень сервиса. Затем я выполняю преобразование DTO в домен, я чувствую, что это ненужный и не очень хороший дизайн.
например, вот мой JSP:
<form:form id="parcelCondemnationCaseDetailsForm"
modelAttribute="parcelCondemnationCaseDetailsDTO">
<form:hidden path="prclSeqNum" />
<form:hidden path="condemnationStatusCode" />
<form:hidden id="isMDOTVerifiedMoveDateAvailable"
path="mDOTVerifiedMoveDateAvailable" />
<div class="form-group">
<div class="row">
<div class="col-md-3">
<label for="finalDisposition">Final Disposition</label>
<form:select class="form-control dirty _enableSaveDisable"
id="finalDisposition" path="finalDisposition"
disabled="${agSecurityFinalDisabled}"
onchange="finalDispositionChange()">
<form:option value="" select="select">Select</form:option>
<form:option value="J">Judgement</form:option>
<form:option value="V">Jury Verdict</form:option>
<form:option value="S">Settlement</form:option>
<form:option value="O">Other</form:option>
</form:select>
</div>
<div class="col-md-3" id="finalDispositionDescriptionDiv"
style="display: none;">
<label for="finalDispositionDescription" class="req-label">Final
Disposition Description</label>
<form:input type='text' id="finalDispositionDescription"
class="form-control dirty _enableSaveDisable" aria-required="true"
path="finalDispositionDescription" maxlength="50"
disabled="${agSecurityFinalDisabled}" />
</div>
<div class="col-md-3">
<label for="finalDispositionDate">Final Disposition Date</label>
<form:input type='text' id="finalDispositionDate"
class="form-control lamdaDate dirty _addDate _pastPresent _enableSaveDisable"
path="finalDispositionDate" disabled="${agSecurityFinalDisabled}" />
</div>
<div class="col-md-3">
<label for="closedDate">Closed Date </label>
<form:input type='text' id="closedDate"
class="form-control lamdaDate dirty _addDate _pastPresent _enableSaveDisable"
path="closedDate" disabled="${agSecurityFinalDisabled}" />
</div>
</div></form:form>
и это мой контроллер
@PostMapping("/saveCaseDetails.htm")
public @ResponseBody String saveCaseDetails(ParcelCondemnationCaseDetailsDTO parcelCondemnationCaseDetailsDTO,
ModelMap model) {
String responseMessage = "";
try {
parcelCondemnationCaseDetailsDTO = parcelCondemnationCaseDetailsService
.saveCaseDetails(parcelCondemnationCaseDetailsDTO);
responseMessage = "success";
} catch (Exception e) {
log.error(
"Error occured while saving Condemnation > Valuation at CondemnationValuationController.saveValuation",
e);
responseMessage = "Error occured while saving Case Details.";
}
return responseMessage;
}
и уровень обслуживания.
public ParcelCondemnationCaseDetailsDTO saveCaseDetails(
ParcelCondemnationCaseDetailsDTO parcelCondemnationCaseDetailsDTO) {
ParcelCondemnation parcelCondemnation = ParcelCondemnationCaseDetailsMapper.INSTANCE
.getCaseDetails(parcelCondemnationCaseDetailsDTO);
parcelCondemnationRepository.save(parcelCondemnation);
Я не вижу, чтобы я добавлял какое-либо значение при выполнении преобразования DTO в домен.
Итак, мой вопрос, могу ли я каким-либо образом избежать использования DTO, картографов и дополнительной строки кода?
Спасибо, что посмотрели.
Ответ №1:
Поскольку ваша сущность — это именно ваш DTO, вы можете использовать @JsonView
аннотацию в вашем контроллере и непосредственно в вашем классе сущностей, который может фильтровать поля, которые вы хотите отобразить в вашем пользовательском интерфейсе в качестве ответа.
@PostMapping("/saveCaseDetails.htm")
@JsonView(View.Public.class)
public @ResponseBody String saveCaseDetail
...
@Entity
public ParcelCondemnation {
@JsonView(View.Public.class)
private String anyFieldtoShow;
private String anyFieldToNotShow;
...
public class Views {
public static class Public {}
}
В этом случае ваш ответ будет отображать только anyFieldToShow
в качестве ответа на любой запрос к этой точке, аннотированный соответствующим JsonView
.
Вот лучшее объяснение: руководство по Baeldung
И я знаю, что вы, возможно, можете использовать GraphQL, о котором, к сожалению, у меня недостаточно знаний, чтобы говорить, но здесь он следует по ссылке, если вы хотите углубиться: GraphQL doc
Комментарии:
1. Спасибо за ваши комментарии, однако, как справиться с ситуацией, когда у меня будет пользовательский интерфейс date is и суммы, представленные в валютных форматах? Пользовательский интерфейс может отправлять date в виде строки и current снова в виде строки.
2. Добро пожаловать. Я не совсем понял, что вы имели в виду, можете ли вы обновить свой вопрос с более подробной информацией или создать другой?