跳转到内容

ServerAction

系统内置 Server Action

每个持久化模型都会由 Trantor 自动创建三个 Server Action :create 、update 、delete,对应的key分别为:

moduleKey_modelKey_create:创建模型数据

moduleKey_modelKey_update:更新模型数据

moduleKey_modelKey_delete:删除模型数据

自定义 Server Action

目前 Server Action 只能在代码中定义,通过 @TAction 在方法上注解声明,此外 Action 方法所在类必须是一个 Spring bean。 @TAction 注解包括如下,详情见@TAction注解:

方法说明
String key() default ""选填,Server Action key ,模块内惟一。不填时则自动按 ClassSimpleName::methodName 生成。
Class<? extends BaseModel> modelClass()必填,绑定的模型,同时也是入参模型
boolean enableValidation() default true选填,是否对入参开启静态校验
NextKey nextSystem() default NextKey.NONE选填,接下来执行的系统内置 Action ,当想在标准 CUD 前面前置业务校验时适用

示例如下:

@Component
public class StudentServerAction {
@Autowired
private StudentRepository studentRepo;
@TAction(modelClass = Student.class)
public void save(@TParam Student student) {
studentRepo.saveWithRelationSkipNull(student);
}
}

入参注入

Trantor 会按以下规则将入参注入方法参数列表中:

@TParam

表示参数是入参模型的一个字段,或者是入参记录中的某项数据。一般在需要指定参数别名以匹配模型字段时使用,其余时候可以缺省,方法包括如下,详情见@TParam注解。

方法说明
String value() default "";参数别名,对应模型中的 field name

示例如下:

@Component
public class StudentServerAction {
@Autowired
private StudentRepository studentRepository ;
@TAction(modelClass = Student.class)
public void delete(@TParam("id") String id){
studentRepository.delete(id);
}
}

注:当 模型中有 name 字段且参数名也对应时,可以缺省 @TParam。

@TCollectionParam

使用常用场景为 Table 上的多选按钮传参。表示参数是一个集合。由于泛型擦除的缘故,需要用指定集合的泛型类型,方法包括如下,详情见@TCollectionParam注解。

方法说明
Class<?> value();由于泛型擦除的缘故,需要用指定集合的泛型类型

示例如下:

@TAction(modelClass = Company.class)
public void batch(@TCollectionParam(Long.class) List<Long> id) {
// 需要注意的是方法参数名需要与入参数据匹配
}

@TModelParam

表示该参数为一个模型,一般可缺省。可以配合 @Load@Valid 使用,详情见@TModelParam注解。

示例如下:

可以显示使用 @TModelParam 指定参数为模型

@TAction(modelClass = Company.class)
public void create(@TModelParam Company company) {
}

正常情况下可以缺省

@TAction(modelClass = Company.class)
public void create(Company company) {
}

@TModelsParam

表示该参数为模型集合,需要指定模型 class。可以配合 @Load@Valid 使用,详情见@TModelsParam注解。

方法说明
Class<? extends BaseModel> value();由于泛型擦除的缘故,需要用指定集合的泛型类型

示例如下:

@TAction(modelClass = Company.class)
public void batch(@TModelsParam(Company.class) List<Company> company) {
}

@Load

填充模型的指定字段,默认不包含关联字段。详情见@Load注解和ParamModelLoader接口。

示例如下:

public class MyCompanyParamModelLoader implements ParamModelLoader {
@Override
public Consumer<Select<String, Object>> select() {
return select -> {
select.getAll();
// 除了模型全部字段外,还额外获取了公司下的员工信息
select.getObject(Company.staff_field);
};
}
}
@TAction(modelClass = Company.class)
public void create(@Load(select = MyCompanyParamModelLoader.class) Company company) {
}

@Valid

开启参数校验,详情见@Valid注解。

示例如下:

@TAction(modelClass = Company.class)
public void create(@Valid Company company) {
}

@TEnvParam

Server Action 可以接收这些 env ,通过 @TEnvParam 注解一个 Map<String, Object> 类型的入参即可(简而言之:map型的参数),详情见@TEnvParam注解。。

示例如下:

Action标签下定义:

<Action :env="{name:getContainerByKey('company').data.name,id:getContainerByKey('company').data.id}"/>

ServerAction获取:

public void someActionMethod(@TEnvParam Map<String, Object> env) {
String name = env.get("name");
String id = env.get("id");
}

自定义业务校验

而在此自定义 Server Action 中,只需要在业务检查失败时抛出异常即可。

例子如下:

@Component
public class AttributeAction {
@TAction(modelClass = Attribute.class, nextSystem = TAction.NextKey.CREATE)
public void create(Attribute attribute) {
if (attribute.isRequired() && attribute.getValue() == null) {
throw new ActionErrorException("属性为必填但值为空");
}
}
}

自定义信息返回

在某些场景, 业务处理完毕后, 会提示用户, 可以通过 ActionBusinessMessage 来完成相关功能. 目前支持 success, info, warning 和 error, 对应到不同的前端提示类型, 另外还有 Weak, Strong, 用来区分提示信息的强度, Weak 是以信息浮窗的形式, Strong 则是弹出框需要确认后才会继续执行下面的动作。示例如下:

@TAction(modelClass = User.class)
public ActionBusinessMessage update(User user) {
// do ....
return ActionBusinessMessage.info("update user success", user);
}

自定义文件下载

某些场景我们需要自定义一些文件下载, Trantor 本身不支持将文件流直接返回, 所以需要通过 OSS 等文件存储来完成下载的功能。 仅需要返回 OssDownloadModel 模型, 在其中声明 oss url 即可。

示例如下:

@TAction(modelClass = User.class, outModelClass = OssDownloadModel.class)
public OssDownloadModel download(User user) {
OssDownloadModel downloadModel = new OssDownloadModel();
downloadModel.setOssUrl("http://url");
return downloadModel;
}

Action 接口文档

当一个方法被 @TAction 注解时,除了生成 Action,还会生成一个以模型为 tag 的 Swagger 接口文档。

访问地址 模块地址/action-doc。该接口基本与 Trantor 内部调用一致,也会有用户权限等拦截