DataAction
DataAction获取数据包括获取单条数据,获取多条数据,分别实现不同的接口,实现对应的load方法。
入参 QueryValues
前端在多选、Filter 等不同的交互场景下可能为同一个字段提交单值、集合值或者范围值。为了兼容前端交互场景,前端入参通过QueryValues接收。
包含的方法如下,详情见QueryValues类:
| 方法 | 功能 |
|---|---|
| public boolean isType(String key, QueryValue.Type type) | 判断给定 key 的值类型 |
| public | 按 key 获取单值 value 。如果非单值 value 会抛出错误 |
| public | 按 key 获取集合 value 。如果非集合 value 会抛出错误 |
| public | 按 key 获取范围 value 的起始值。如果非范围 value 会抛出错误 |
| public | 按 key 获取范围 value 的终点值。如果非范围 value 会抛出错误 |
| public Map<String, Object> flatten() | 将所有 QueryValue 展平,获取内包的 value 值 |
返回单条数据
实现 io.terminus.trantor.sdk.datasource.SingleDataAction 并注入为 SpringBean 即可。
public interface SingleDataAction<M extends BaseModel> { M load(QueryValues queryValues);}举例:
//这里演示dataAction 返回单条数据的场景@Componentpublic class StudentSingleDataAction implements SingleDataAction<Student> {
@Autowired private StudentRepository studentRepo;
@Override public SingleDataResult<Student> load(SingleDataParams singleDataParams) {
Integer id = singleDataParams.getQueryValues().getOneValue("id"); Student student = studentRepo.findById(Long.valueOf(id)).get();
return new SingleDataResult(student); }}Trantor 会在启动时扫描到该 bean ,并将其注册为一个 DataSource 类型的 Action 。key 为 moduleKey_ClassSimpleName 。所属模型为产生的数据的所属模型(即泛型的具体类型)。在上面示意的例子下,该 Action 的 key 为 example_action_Student_StudentSingleDataAction ,属于 example_action_Student 模型
返回多条数据
和返回单条数据类似,区别在于需要实现不同的 interface
public interface MultiDataAction<M extends BaseModel> {
MultiDataResult<M> load(QueryValues queryValues, MultiDataParams multiDataParams);}其中多出的第二个参数 MultiDataParams 里包括了 paging 、order 和 group 的参数信息。
举例:
/*** 这里演示dataAction 返回多条数据的场景*/@Componentpublic class StudentMultiDataAction implements MultiDataAction<Student> {
@Autowired private StudentRepository studentRepo;
@Override public MultiDataResult<Student> load(MultiDataParams multiDataParams) {
int pageNo = multiDataParams.getPaging() != null ? multiDataParams.getPaging().getNo() : 1; int pageSize = multiDataParams.getPaging() != null ? multiDataParams.getPaging().getSize() : 10;
Paging<Student> solutions = studentRepo.page(conditionSet -> {
}, pageNo, pageSize);
return new MultiDataResult<>(solutions.getData(), solutions.getTotal()); }}