vendredi 7 janvier 2022

How can i avoid code duplication in spring data transfer objects (dto)

I need your recommendations. I'm writing project in Spring Boot. I have one entity and two DTOs on below.

entity DeviceReservation.java

@Entity
@SQLDelete(sql = "UPDATE device_reservation SET deleted='Y' WHERE id=?")
public class DeviceReservation extends SoftDeleteSupport {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne
    private User user;

    @ManyToOne
    @JsonIgnore
    private Device device;

    private OffsetDateTime startTime;
    private OffsetDateTime endTime;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private OffsetDateTime updateTime;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String updateReason;

    public DeviceReservation() {
    }

    public DeviceReservation(User user, Device device, OffsetDateTime startTime, OffsetDateTime endTime, OffsetDateTime updateTime, String updateReason) {
        this.user = user;
        this.device = device;
        this.startTime = startTime;
        this.endTime = endTime;
        this.updateTime = updateTime;
        this.updateReason = updateReason;
    }

 // getters and setters
}

dto1 DeviceReservationDTO.java

public class DeviceReservationDTO {

    private Long id;
    private String username;
    private String deviceId;
    private OffsetDateTime startTime;
    private OffsetDateTime endTime;
    private OffsetDateTime updateTime;
    private String updateReason;

     public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }

    public OffsetDateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(OffsetDateTime startTime) {
        this.startTime = startTime;
    }

    public OffsetDateTime getEndTime() {
        return endTime;
    }

    public void setEndTime(OffsetDateTime endTime) {
        this.endTime = endTime;
    }

    public OffsetDateTime getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(OffsetDateTime updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdateReason() {
        return updateReason;
    }

    public void setUpdateReason(String updateReason) {
        this.updateReason = updateReason;
    }
}


I don't want this two fields in my response: updateTime and updateReason. The dto above is used in too many places so I don't want to edit this dto (dto1 DeviceReservationDTO.java). I created the dto below, without this two fields.

dto2 DeviceReservationResponseDTO.java

public class DeviceReservationResponseDTO {

    private Long id;
    private String username;
    private String deviceId;
    private OffsetDateTime startTime;
    private OffsetDateTime endTime;

    public DeviceReservationResponseDTO() {
        // Do nothing
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(String deviceId) {
        this.deviceId = deviceId;
    }

    public OffsetDateTime getStartTime() {
        return startTime;
    }

    public void setStartTime(OffsetDateTime startTime) {
        this.startTime = startTime;
    }

    public OffsetDateTime getEndTime() {
        return endTime;
    }

    public void setEndTime(OffsetDateTime endTime) {
        this.endTime = endTime;
    }
}

Problem is starting now. Sonarqube is showing to me this error for duplications: Sonar Error

I say it again, I don't want this two fields in my response: updateTime and updateReason.

There is my question: How can i avoid code duplication? What is correct approach? How can i design this code? Should I edit all DeviceReservationDTO.java used places? Should i stop this rule in sonarqube?

If you need to see other related codes:


public List<DeviceReservationResponseDTO> getReservationByDeviceId(@PathVariable Long deviceId) {
        return reservationService
                .getReservationsByDeviceId(deviceId)
                .stream()
                .map(this::convertToReservationResponseDTO)
                .collect(Collectors.toList());
}


private DeviceReservationResponseDTO convertToReservationResponseDTO(DeviceReservation deviceReservation) {
        modelMapper = new ModelMapper();
        TypeMap<DeviceReservation, DeviceReservationResponseDTO> typeMap = modelMapper
                .createTypeMap(DeviceReservation.class, DeviceReservationResponseDTO.class);

        typeMap.addMappings(m -> m.map(src -> src.getUser().getUserName(), DeviceReservationResponseDTO::setUsername));
        return modelMapper.map(deviceReservation, DeviceReservationResponseDTO.class);
}

Aucun commentaire:

Enregistrer un commentaire