做个笔记:
功能:创建租户时同时创建此租户的管理员账号,租户表包含管理员账号,同时账号存放在管理员表;
租户表:租户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)