spring boot动态对象建模

时间:2018-03-03 09:34:50

标签: java oop spring-boot

我正在使用spring boot创建RESTful API。我有需要向资源提出请求

  

/用户/通知

通知资源将接受bodyrequest中的值并将通知发送给用户。

@ResponseBody
@RequestMapping(value = "/user/notification", method = RequestMethod.POST)
public NotificationResponse sendNotification(@Valid @RequestBody NotificationRequest notificationRequest){
  // here is code where I need to build right
  // object of type text/file/link/map (please read full question below)
   notificationService.send(notificationRequest.getUsername(), object);
}

接受:用户名和通知数据。这是 NotificationRequest 类:

public class NotificationRequest {

  @NotEmpty
  private String username;

  @NotEmpty
  private String type;

  private String title;

  @NotEmpty
  private String content;

  private String url;

  private String longitude;

  private String latitude;

  private String file_url;

 //getters and setters
 }

我有4种类型的通知,即。文字,链接,地图和文件。他们的属性就是这些。

text
  - type
  - title
  - content

link
  - type
  - title
  - content
  - url

map
 - type
 - title
 - longitude
 - latitude

file
 - type
 - title
 - content
 - file_url

我为这些创建了4个类,因此我可以创建正确的对象,正如您所看到的,类型标题是常见属性,因此我使用了继承。

public class NotificationBase {
  private String type;
  private String title;
  //getters and setters here
 }

并扩展了其他4个类。

 public class TextNotification extends NotificationBase {
    private String content; 
   //getters and setters here
 }

我的问题是,我如何创建我的课程

如果有人想发送文本通知,我可以获得TextNotification的对象,如果有人想发送文件通知,我可以创建FileNotification对象吗?

注意:请注意我不想在这种情况下使用gJson或Jackson创建JSON对象。

如果我需要在此处添加更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

您可以使用jackson注释进行子类型化。在您的情况下,您有字段type,它将表示您期望的对象的类型。

因此,最好只在需要的字段中使用抽象的NotificationRequest类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = TextNotificationRequest.class, name = "text"),
            @JsonSubTypes.Type(value = LinkNotificationRequest.class, name = "link")})
public abstract class NotificationRequest {

  @NotEmpty
  private String username;

  @NotEmpty
  private String type;

  private String title;

  public abstract NotificationResponse buildNotificationResponse();
}

并实现您需要的每种类型。

public class TextNotificationRequest extends NotificationRequest {
 public String content;

 public NotificationResponse buildNotificationResponse{
   return new TextNotificationResponse(content);
 }
}

现在你可以做这样的事情

@ResponseBody
@RequestMapping(value = "/user/notification", method = RequestMethod.POST)
public NotificationResponse sendNotification(@Valid @RequestBody NotificationRequest notificationRequest){
   NotificationResponse response = notificationRequest.buildNotificationResponse();
   notificationService.send(notificationRequest.getUsername(), response);
}

以下是一些解释。通过设置这些注释,您要对jackson根据type字段的值实例化哪个类说。如果type == "text" jackson将实例化TextNotificationRequest,依此类推。现在,您可以使用多态的强大功能来创建NotificationResponse并避免if-else语句。

同样jackson不仅允许基于字段值进行子类型化。您可以在此处阅读更详细的信息@JsonTypeInfo