-
Notifications
You must be signed in to change notification settings - Fork 33
自动填充
一般情况下,crane4j
将在代码里面使用 OperateTemplate
或者 BeanOperationExecutor
完成的填充操作称为手动填充,对应的,基于 SpringAOP 提供的在切面中自动完成方法入参与返回值填充的操作称为自动填充。
基于 SpringAOP
,crane4j
提供了用于自动填充方法返回值的切面类 MethodResultAutoOperateAspect
,当我们在方法上添加 @AutoOperate
后,即可在方法返回时对返回值进行自动填充:
@AutoOperate(type = Foo.class)
public List<Foo> getFooList() {
// do nothing
}
返回值类型可以是单个对象、对象数组或对象的 Collection
集合。
在一般的业务场景中,我们往往会将注解添加在 Controller
中的方法上,而这些方法的返回值有经常会使用通用响应体包装,比如:
public class Result<T> {
private Integer code;
private T data;
}
@AutoOperate(type = Foo.class)
public Result<List<Foo>> getFooList() {
// do nothing
}
上述方法实际上需要填充的对象不是 Result
,而是 Result
中的 data
。除了在 data
上添加 @Disassemble
注解声明拆卸外,还可以直接通过 AutoOperate.on
指定提取特定属性值进行填充,比如:
@AutoOperate(type = Foo.class, on = "data")
public Result<List<Foo>> getFooList() {
// do nothing
}
通过注解的 condtion
可以设置应用条件的表达式,在执行填充前,将会根据表达式的计算结果确定是否要执行这次填充,比如:
@AutoOperate(type = Foo.class, condition ="#result.size > 0 && #type != 1")
public List<Foo> getFoo(Integer type) {
// do nothing
}
上述示例表示仅当 方法返回值不为空,且入参的 type 不为 1 时
才执行填充。
默认的表达式引擎为 SpEL 表达式,因此可以在里面可以通过 #result
引用返回值,并通过 #参数名
引用方法入参,返回值可以是 boolean
值,或者 'true'
或 'false'
字符串。
若有必要,用户也可以基于 MethodBaseExpressionEvaluator
扩展并替换默认的实现。
通过注解的 includes
或者 excludes
属性可以设置本次执行的操作组,比如:
@AutoOperate(type = Foo.class, includes = {"base", "foo"},)
public List<Foo> getFoo(Integer type) {
// do nothing
}
上述示例中,当进行填充时,仅会完成 Foo
中 @Assemble.groups
和 @Disassemble.groups
带有 base
或 foo
的装配/拆卸操作。
通过注解的 executor
可以指定本次填充操作的执行器:
@AutoOperate(type = Foo.class, executor = OrderedBeanOperationExecutor.class)
public List<Foo> getFoo(Integer type) {
// do nothing
}
当执行填充时,会从 Spring
上下文中根据类型获得对应的执行器,不同的执行器将会为操作带来不同的影响,比如上述示例指定的 OrderedBeanOperationExecutor.class
支持按规定的顺序同步的完成填充,而 AsyncBeanOperationExecutor
则支持并发填充。
基于 SpringAOP
,crane4j
提供了用于自动填充方法返回值的切面类 MethodArgumentAutoOperateAspect
,当我们在方法上添加 @ArgAutoOperate
后,即可在方法执行前对入参进行自动填充:
// 1.注解注解在参数上
@ArgAutoOperate
public void getFooList(@AutoOperate(type = Foo.class) Foo foo) {
// do nothing
}
// 2.注解在方法上
@ArgAutoOperate(@AutoOperate(value = "foo", type = Foo.class))
public void getFooList(Foo foo) {
// do nothing
}
除了方法必须添加 @ArgAutoOperate
外,用户可以选择直接在 @ArgAutoOperate
注解的 value
属性里面声明填充,也可以在直接在方法参数前添加注解声明填充,两者声明方式效果是一样的,也可以混用。
与返回值填充一样,填充的数据可以是单个对象、对象数组或对象的 Collection
集合类型的参数,同时也支持包括包装类提取、应用条件表达式以及分组等在内,返回值自动填充支持的全部功能。