声明:本文仅作探讨,涉及不准确之处还请指出。
近期在项目中遇到一个需求,需要根据提供的模板设计对象,其中一些字段相同,而另一些字段不同。在接收前端传递的对象时,希望能够使用一个公共的类进行接收,然后实现自动装配到对应的对象中。以下是经验总结与代码优化。
首先,在研究了一篇作者在Spring Boot2中使用的注解文章后,发现其通过反序列化实现了对象的自动装配,经实测证明其有效。为此,我首次在父类中编写了子类所共有的方法,从而完成了对象的自动装配。
文章地址 https://www.jianshu.com/p/0e0b97c0218c
接着,在测试子类独有属性的set和get方法时,发现自动装配的对象仅包含子类独有的属性。为解决这个问题,我猜测在父类中需要加入子类共有属性。然而,在实践过程中遇到报错,提示需要添加@Field注解。
因此,我在父类中加入了子类共有属性,并在这些属性上添加了@Field注解,最终成功解决了问题。
以下是所设计的代码,其中部分内容为mongodb注解,其他数据库操作本质相同。
父类
package com.imis.datamanagement.domain.template;
/*
*
* @Time : 2022/10/14
* @Author : https://blog.csdn.net/m0_56170277
* @File : DataManagement4IMIS
*/
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.List;
import java.util.Map;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "TEMPLATE_TYPE",
visible = true
)
@JsonSubTypes({
@JsonSubTypes.Type(value = Achievememnt.class, name = Achievememnt.TEMPLATE_TYPE),
@JsonSubTypes.Type(value = Communication.class, name = Communication.TEMPLATE_TYPE),
@JsonSubTypes.Type(value = Honor.class, name = Honor.TEMPLATE_TYPE),
@JsonSubTypes.Type(value = Office.class, name = Office.TEMPLATE_TYPE)
})
@Data
public abstract class AbstractTemplate {
String TEMPLATE_TYPE;
Integer id;
@Field("a_tittle")
String title;
@Field("a_other")
Map<String, String> other;
@Field("a_filePath")
List<String> filePath;
@Field("a_createTime")
String createTime;
@Field("a_updateTime")
String updateTime;
@Field("a_deleted")
String deleted;
}
子类1
package com.imis.datamanagement.domain.template;
/*
*
* @Time : 2022/10/13
* @Author : https://blog.csdn.net/m0_56170277
* @File : DataManagement4IMIS
*/
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.List;
import java.util.Map;
@Data
@EqualsAndHashCode(callSuper = true)
@Document(collection = "honor")
public class Honor extends AbstractTemplate{
static final String TEMPLATE_TYPE = "honor";
@Id
private Integer id;
private String title;
private Long uploaderId;
private String num;
private String introduction;
//------------------
private String award_name;
private String time;
private String type;
private String garde;
private String level;
private String name;
private String approval_num;
private String member;
//------------------
private Map<String, String> other;
private List<String> filePath;
private String createTime;
private String updateTime;
private String deleted;
}
子类2
package com.imis.datamanagement.domain.template;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.List;
import java.util.Map;
@Data
@EqualsAndHashCode(callSuper = true)
@Document(collection = "office")
public class Office extends AbstractTemplate {
static final String TEMPLATE_TYPE = "office";
@Id
private Integer id;
private String title;
private Long uploaderId;
private String num;
private String introduction;
//------------------
private String time;
private String type;
private String topic;
private String content;
private String address;
private String participant;
//------------------
private Map<String, String> other;
private List<String> filePath;
private String createTime;
private String updateTime;
private String deleted;
}