Как избежать преобразования DTO в домен и наоборот при весенней загрузке?

#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. Добро пожаловать. Я не совсем понял, что вы имели в виду, можете ли вы обновить свой вопрос с более подробной информацией или создать другой?