我正在使用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对象。
如果我需要在此处添加更多信息,请告诉我。
答案 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