SpringBoot中基于模板的对象自动装配探讨与优化


声明:本文仅作探讨,涉及不准确之处还请指出。

近期在项目中遇到一个需求,需要根据提供的模板设计对象,其中一些字段相同,而另一些字段不同。在接收前端传递的对象时,希望能够使用一个公共的类进行接收,然后实现自动装配到对应的对象中。以下是经验总结与代码优化。

首先,在研究了一篇作者在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值