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 前面前置业务校验时适用 |
示例如下:
@Componentpublic 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 |
示例如下:
@Componentpublic 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 中,只需要在业务检查失败时抛出异常即可。
例子如下:
@Componentpublic 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 内部调用一致,也会有用户权限等拦截