序章:重构,向Spring出发

最近初步完成了一个 EJB 项目到 SpringBoot 框架的重构,复盘一下,留个记录

第一次接触EJB,也不是很懂,是个全栈项目,简述一下EJB项目的情况:

  • 前端使用Angular及一个第三方展示框架
  • 后端EJBIBM Liberty Server
  • DB2数据库

开发过程中遇到的问题:

  • 由于某些安全验证原因,前端没法通过npm start单独启动也就不好Debug,想启动测试,需要每次ng build --prod,然后把成果物copy到后端随server一同启动
  • DevOps无法前后端分离部署,无法满足快速测试的需求
  • 且后端架构的资料较少,不是很 "现代化" 的Spring架构

基于以上,我们开发团队决定趁业务尚不复杂的情况下,全面重构。使用当下流行的前后端分离架构,前端仍然使用Angular,后端选择Spring Boot框架重写,数据库仍然使用目前的DB2。这样在之后的DevOps部署上也会更加灵活。


以下是一些当前EJB项目中的代码示例

以一个Category接口为例,有三层,个人的理解应该有如下的对应关系:

框架 对外接口层 实际干活层 实体类层
EJB CategoryService CategoryBean Category
Spring Controller Service Repository/Entity

CategoryService.java

@Stateless
@Path("/CategoryService")
public class CategoryService {
  @EJB
  CategoryBean categoryBean;

  @GET
  @Produces("application/json")
  @Path("/list")
  public Response list() {
    try {
      return Response.ok().entity(categoryBean.list()).build();
    } catch (Exception e) {
      return Response.serverError().entity(new Exception(Constants.ERROR_READING_DATA, e)).build();
    }
  }
}

CategoryBean.java

@Stateless
@LocalBean
public class CategoryBean {
  @PersistenceContext(unitName = "MDJPA") // 配置在对应 persistence.xml 里
  protected EntityManager em;

  public List list() {
    Query query = em.createNamedQuery("Category.findAll");
    if (query != null) {
      return query.getResultList();
    }
    return new ArrayList<>();
  }
}

Category.java

@Entity
@Table
@NamedQuery(name = "Category.findAll", query = "SELECT c FROM Category c")
public class Category implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @XmlID
  @Column(name = "ID")
  private int id;

  @Column(name = "NAME")
  private String name;

  @Column(name = "CREATE_ID")
  private String createId;
// ...
// Getter Setter

还有诸多零碎配置就不在此列出了,比如persistence.xml,DB2 数据库相关配置,Liberty Server 的server.xml

你可能感兴趣的:(序章:重构,向Spring出发)