spring data Bean 继承 父类拥有子类属性?spring data 忽略字段

做个笔记:

功能:创建租户时同时创建此租户的管理员账号,租户表包含管理员账号,同时账号存放在管理员表;

租户表:租户id,租户名称,租户管理员账户,创建时间

管理员账户表:管理员账户,登录密码

思路:为了充分发挥spring data的作用(手动滑稽~_~),所以我决定前台传值(租户名称,管理员账号,pwd,age)将其张换成json传值后台,后台新建一个临时租户bean继承租户表对应的Bean,临时Bean字段为pwd,创建临时bean为的是将前端传值转换成有一个bean。然后我想解释的就是临时bean存在的意义。

然后上栗子:

公司bean包含字段:公司名称,管理员账户名称,管理员age

@Document("company")
public class Company {
    private String companyName;
    private String adminUser;
    private int age;

    public String getAdminUser() {
        return adminUser;
    }

    public void setAdminUser(String adminUser) {
        this.adminUser = adminUser;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Company{" +
                "adminUser='" + adminUser + '\'' +
                ", age=" + age +
                '}';
    }
}

 管理员Bean字段:管理员名称、登录密码、age

@Document("admin_user")
public class AdminUser {

    private String adminName;
    private int age;
    private String pwd;

    public String getAdminName() {
        return adminName;
    }

    public void setAdminName(String adminName) {
        this.adminName = adminName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "AdminUser{" +
                "adminName='" + adminName + '\'' +
                ", age=" + age +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

 临时Bean为了转换前台数据而存在的bean,字段:pwd

public class CompanyParam extends Company {
    private String pwd;

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "CompanyParam{" +
                "pwd='" + pwd + '\'' +
                '}';
    }
}

controller:ennn,没错就一个接口

@RestController
@RequestMapping("/regodter")
public class RegisterRestController {

    private RegisterService registerService;

    @Autowired
    public RegisterRestController(RegisterService registerService) {
        this.registerService = registerService;
    }

    @PostMapping("")
    public Company create(@Validated @RequestBody CompanyParam companyParam){
        return registerService.createCompany(companyParam, companyParam.getPwd());
    }
}

service: 这儿有俩方法,创建company的和生成user的

 然后这里需要说明一下,我controller里面调用时传递的事临时bean(子类) CompanyParam  service方法里面是公司的实体类(父类) Company 当时想的是,直接将Company  进行储存(这里没有描述清楚,希望大神指点)。enn,因为这个想法所以在这里出了问题;

@Service
public class RegisterService {

    private static final Logger LOGGER = LoggerFactory.getLogger(RegisterService.class);

    public Company createCompany(Company company, String pwd){
        AdminUser user = createUser(company.getAdminUser(), company.getAge(), pwd);
        //假装储存了user 用户表.save(user);
        //假装储存了company 公司表.save(company);
        return company;
    }

    private AdminUser createUser(String name,int age,String pwd){
        AdminUser adminUser = new AdminUser();
        adminUser.setAdminName(name);
        adminUser.setAge(age);
        adminUser.setPwd(DigestUtils.md5Hex(pwd)) ;
        return  adminUser;
    }
}

都准备好了,那就调用一下接口测试一下吧;工具postman

请求:

 返回:

 

WHAT?  wtf!! 希望看到这里各位看官还是清醒的,在这里我强行解释一波吧,我的理解是,service 方法中需传的参的是父类,然后我将子类传递进去,以为会进行剔除,然鹅没有,将pwd也存入了company表了,然后我找到了俩解决方式:

方式一:将两个bean进行一个copy

Company company= new Company();
BeanUtils.copyProperties(companyParam,company);

方式二:在CompanyParam 中加注解@Transient(import org.springframework.data.annotation.Transient;)

 @Transient
 private String pwd;

(enn哈哈 如果有这个需求的朋友可以联系我,咱们详谈,有错误也请各位放肆的☞出,thank you)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值