# PersistFunction 持久化函数

MornBoot提供多种函数式接口,处理不同业务场景下的持久化操作,实现业务代码之间低耦合。将数据验证、关联处理等常见操作与业务代码彻底分离。

Since:v1.2.0

# 数据验证

业务场景

删除部门时,若部门中存在用户,则不能删除。

# Trigger Validator

使用PersistFunctionUtils触发删除校验

public class DepartmentService {
  public void delete(TestDepartment department) {
    boolean valid = PersistFunctionUtils.validateDelete(department);
    // if valid, do delete department...
  }
}

传统项目中,要实现类似功能,DepartmentService必须直接或间接引用UserService,一旦验证链过于庞杂,就会非常不利于维护,但MornBoot可以避免这个问题。

# Validator

实现DeleteValidator<T>验证器接口,并使用@Source指定验证源

@Component
@Source(TestDepartment.class)
public class DepartmentDeleteValidator implements DeleteValidator<TestDepartment> {

  @Override
  public boolean validate(TestDepartment source) {
    // dependency UserService for getting user by departmentId, here is a mock
    boolean isEquals = Objects.equals(source.getId(), USER.getDepartmentId());
    if (isEquals) {
      // u can also throw an ApplicationException to rollback the transaction
      log.warn("无法删除部门,仍有用户关联。");
    }
    return !isEquals;
  }
}

由于相关验证器数量可以是0~n,因此无论验证器使用何种方式实现,都不会导致DepartmentService和任何其它业务强耦合

# Expand

  • AddValidator:新增
  • UpdateValidator:更新
  • PersistValidator:自定义场景

# 关联处理

类似数据验证 (opens new window),关联处理也可以达到高内聚、低耦合的目的

业务场景

删除部门时,同步至其它系统,并通知负责人

# Trigger Processor

使用PersistFunctionUtils触发处理函数

public class DepartmentService {
  public void delete(TestDepartment department) {
    // do delete department...
    PersistFunctionUtils.handleDelete(department);
  }
}

# Processor

实现DeleteProcessor<T>处理者接口,并使用@Source指定处理源。

@Component
@Source(TestDepartment.class)
public static class NotifyDepartmentDeleteProcessor implements DeleteProcessor<TestDepartment> {

  @Override
  public void handle(TestDepartment data) {
    // get manager by departmentId
    // do notify manager
  }
}
@Component
@Source(TestDepartment.class)
public static class SendDepartmentDeleteProcessor implements DeleteProcessor<TestDepartment> {

  @Override
  public void handle(TestDepartment data) {
    // do send department to other system
  }
}

若处理函数与持久化业务无关,则应阻止异常抛出,以避免影响持久化事务

# Expand

  • AddProcessor:新增
  • UpdateProcessor:更新
  • PersistProcessor:自定义场景