为REST请求和响应创建不同的类是不是很糟糕?

时间:2016-05-23 09:00:13

标签: java rest

我正在使用Spring Boot项目,作为我的工具,几乎每个API都有请求响应类。

例如:

@Data
@AllArgsConstructor
public class AddNoticeRequest{
    private String subject;
    private String message;
    private Long timeToLive;
}

请求和响应类如下所示:

// Ommiting some annotations for brevity
public class AddNoticeResponse{
    private String subject;
    private String message;
    private Long timeToLive;
    private Date createTime;
    private String creator;
} 
Notice

我有两个问题。

  • 创建太多的类并将它们命名一段时间让我疯了。
  • 某些请求和响应有共同的字段。

例如:有两种EmailNotificationpublic class Email { private String subject; private String message; private String receiver; }

public class AddNoticeRequest {

    private String subject;
    private String message;

    class Email extends AddNoticeRequest{
        private String receiver;
    }
}

那么,我应该使用扩展公共类的内部类还是只将所有字段放入一个类中?哪个更好?

public class AddNoticeRequest{
    private String subject;
    private String message;
    private Long timeToLive;
    private String receiver;
}
Email

然后,当客户端执行添加 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> //Your first xml (main) layout here <LinearLayout android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFD6DD" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sample Slide" android:textColor="#FF5656" android:textSize="22sp" android:textStyle="bold" /> </LinearLayout> //Your second xml (overlay) layout here. this may be relative/linear layout <RelativeLayout android:id="@+id/overlay" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#88888888" android:gravity="center" android:visibility="gone" /> </RelativeLayout> 通知的请求时,某些字段是否为空?

3 个答案:

答案 0 :(得分:11)

从长远来看,使用量身定制的DTO进行请求和响应将为您提供更大的灵活性。实际上,没有什么能阻止你使用继承和内部类,但我会避免它。

我已经回答了类似的问题here,强调了在REST API中使用DTO而不是持久性实体的好处。您将在下面找到这种方法的一些好处:

  • DTO可以定制以满足您的需求,并且在仅暴露持久性实体的一组属性时它们非常棒。您不会需要@XmlTransient@JsonIgnore等注释来避免某些属性的序列化。
  • 通过使用DTO,您将在持久性实体中避免地狱注释,也就是说,您的持久性实体不会因​​非持久性相关注释而变得臃肿;
  • 在创建或更新资源时,您将对所接收的属性进行完全控制;
  • 如果您使用Swagger来记录REST API,则可以使用@ApiModel@ApiModelProperty注释来记录您的API模型,而不会弄乱您的持久性实体;
  • 您可以为每个版本的API使用不同的DTO;
  • 在映射关系时,您会有更大的灵活性;
  • 您的DTO可以包含HATEOAS的链接列表。这不应该被添加到持久性对象中。
  • 您可以使用映射框架(例如MapStruct)将REST API DTO映射到/来自持久性对象。

答案 1 :(得分:1)

不要对req / resp对象进行子类化。

在框架工作中使用像Jackson这样的auto de / serialiser将消息有效负载转换为业务对象。

但是,您仍将使用大量业务对象。

答案 2 :(得分:0)

我建议您使用 JSON 格式,而不是每次创建类并返回其实例。但是,如果你需要一个类层次结构,你可以创建一个类并放置一个存储JSON的变量。