一、前言
我们在开发中经常需要对用户请求参数进行准入校验,比如:校验非空,长度,数字等;另外响应参数我们可能需要统一进行数据转换,比如:将返回的参数修改为用户指定字段,对数据进行取整,四舍五入等。这个时候我们就需要用到统一校验及响应参数统一处理。
二、关于统一校验
服务端的校验我们首先想到的是hibernate validator,比如字段非空,字段长度限制,邮箱格式验证等等,但对于枚举校验validdator就不支持了。这里介绍一种方式,自定义Validator注解:
1.定义枚举类EnumValue
/**字符串或数组指定值校验*/@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })@Retention(RUNTIME)@Documented@Constraint(validatedBy = { EnumValueValidator.class })public @interface EnumValue {/**默认错误消息*/String message()default "必须为指定值";/**字符串数组*/String[] strValues() default {};/**数字数组*/int[] intValues() default {};/**分组*/Class>[] groups() default {};/**负载*/Class extends Payload>[] payload() default {};/**指定多个时使用*/@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })@Retention(RUNTIME)@Documented@interface List {/**获取数据数组*/EnumValue[] value();}}
2.设置校验规则EnumValueValidator
/**字符串或数组指定值校验*/public class EnumValueValidator implements ConstraintValidator {/**字符串数组*/private String[] strValues;/**数字数组*/private int[] intValues;@Overridepublic void initialize(EnumValue constraintAnnotation) {strValues = constraintAnnotation.strValues();intValues = constraintAnnotation.intValues();}@Overridepublic boolean isValid(Object value, ConstraintValidatorContext context) {if (value instanceof String) {for (String s : strValues) {if (s.equals(value)) {return true;}}} else if (value instanceof Integer) {for (Integer s : intValues) {if (s == value) {return true;}}} else {return false;}return false;}}
3.校验Vo添加对应注解:
我们在需要校验的属性上添加@EnumValue,就实现了我们自定义校验方式。
@EnumValue(strValues = { "01","02"}, message = "证件类型必须为01-身份证,02-居住证")private String queryCertType;
三、关于返回值统一处理
返回值统一处理我举一个场景,比如一个VO中返回的字段较多,需要对金额字段进行四舍五入保留两位小数,一种方式我们可以在sql中对字段进行处理,第二种方式我们可以在业务逻辑代码中进行处理,这里我介绍另一种方式,通过注解的方式实现:
1.自定义JSON数据序列化
我们通过继承JsonSerializer实现自定义序列化规则,各种需要统一转换的场景都可以通过这种方式实现。
public class CreditDataSerialize extends JsonSerializer {/**格式化保留两位小数*/private DecimalFormat df = new DecimalFormat("0.00");@Overridepublic void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)throws IOException {if (s != null) {Double sv = Double.parseDouble(s);/**判断是否符合取整条件*/if (sv.intValue() - sv == 0) {jsonGenerator.writeString(String.valueOf(sv.intValue()));} else {/**四舍五入*/df.setRoundingMode(RoundingMode.HALF_UP);jsonGenerator.writeString(df.format(sv));}}}}
2.响应VO添加注解
/** 单月最高逾期总额 */@JsonSerialize(using = CreditDataSerialize.class)private String loanOverMthTotalAmt;
还有很多其他的处理方式,欢迎交流。