首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现Java(spring boot)2阶段注册?

如何实现Java(spring boot)2阶段注册?
EN

Stack Overflow用户
提问于 2018-09-27 04:52:28
回答 1查看 0关注 0票数 0

我用spring boot创建了一个小项目。

应用程序将拥有不同类型的用户,在注册的第一阶段(帐户实体),每个用户都必须使用所有用户应具有的公共字段来填写表单。

第一阶段用户将注册到数据库后,他可以登录到该应用程序。

在注册的第一阶段,用户应选择角色。

应用程序应具有的角色:

  • 供应商
  • 产品消费者(客户)

注册完成后,用户将登录该应用程序,他将根据先前的角色选择查看包含供应商或产品消费者字段的表单。

我的问题是:

春季启动中最好的/干净的解决方案是什么,从专业用户的第一阶段组成普通用户实体?

EN

回答 1

Stack Overflow用户

发布于 2018-09-27 14:45:35

在第一步中,已经提到用户将拥有一个通用帐户:

代码语言:txt
复制
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
@DiscriminatorColumn(name = "role")
public class Account {

    @Id
    private String id;

    private String firstName;

    private String lastName;

    @Transient
    @JsonIgnore
    public String getRole(){
        return null;
    }
    //getters and setters
}

这个实体是独立的,所以它不需要是一个抽象类。下一步是创建专用帐户:

代码语言:txt
复制
@Entity
@DiscriminatorValue(ROLE_CLIENT)
public class ClientAccount extends Account {

    public static final String ROLE_CLIENT = "ROLE_CLIENT";
    // specific client stuff

    @Override
    public String getRole() {
        return ROLE_CLIENT;
    }
}

代码语言:txt
复制
@Entity
@DiscriminatorValue(ROLE_SUPPLIER)
public class SupplierAccount extends Account {

    public static final String ROLE_SUPPLIER = "ROLE_SUPPLIER";
    // specific supplier stuff

    @Override
    public String getRole() {
        return ROLE_SUPPLIER;
    }
}

第一步:

代码语言:txt
复制
    Account user = new Account();
    user.setId("123");
    user.setFirstName("FirstName");
    user.setLastName("LastName");
    accountRepository.save(user);

第二步:

代码语言:txt
复制
public <T> T convertAccount(Account account, Class<? extends Account> newAccountType) throws IOException {
    if (account.getRole() != null) {
        throw new IllegalArgumentException("Cannot convert a specialized account");
    }
    ObjectMapper objectMapper = new ObjectMapper();
    return (T) objectMapper.readValue(objectMapper.writeValueAsBytes(account), newAccountType);
}

@Transactional
public void updateAccount(Account account) {
    accountRepository.deleteById(account.getId());
    accountRepository.save(account);
}

示例;

代码语言:txt
复制
    Optional<Account> targetAccount = accountRepository.findById("123");
    updateAccount(convertAccount(targetAccount.get(), ClientAccount.class));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档