spring 为请求和响应使用单独的DTO时避免代码重复

m3eecexj  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(239)

我使用DTO模式来管理Sping Boot REST应用程序中的HTTP主体。我为请求和响应使用了单独的DTO,因为响应包含附加数据。我为响应DTO使用了继承,因为包含的附加数据对于所有响应对象都是相同的。结构如下(省略了注解和方法以便于清除):

public abstract class BaseResponseDTO {
    protected UUID id;
    protected Integer version;
    protected Date created;
    protected Date modified;
}

public class RequestUserDTO {
    private String firstName;
    private String lastName;
}

public class ResponseUserDTO extends BaseResponseDTO {
    private String firstName;
    private String lastName;
}

此处存在明显的代码重复。最好让ResponseUserDTO同时扩展BaseResponseDTO和RequestUserDTO,但这是不允许的。
其他选择是使用组合,并具有如下内容:

public abstract class BaseResponseDTO {
    protected UUID id;
    protected Integer version;
    protected Date created;
    protected Date modified;
}

public class UserDTO {
    private String firstName;
    private String lastName;
}

public class RequestUserDTO {
    private UserDTO payload;
}

public class ResponseUserDTO extends BaseResponseDTO {
    private UserDTO payload;
}

我使用这种方法的问题是:
1.它仍然不能防止代码重复
1.它强制客户端将正文 Package 在payload
对此我们能做些什么呢?

xam8gpfp

xam8gpfp1#

我认为您可以用UserDTO替换您的ResponseUserDTORequestUserDTO,并在其上扩展BaseResponseDTO,当您使用UserDTO发送请求主体时,代码不会关心您是否将其与BaseResponseDTO沿着发送(因为我在此处未看到任何验证),因此如果您不打算在请求函数中使用这些内容,也没关系

public abstract class BaseResponseDTO {
      protected UUID id;
      protected Integer version;
      protected Date created;
      protected Date modified;
}
public class UserDTO extends BaseResponseDTO {
      private String firstName;
      private String lastName;
}

相关问题