spring 处理带有特殊字符的请求_几个关于Spring请求响应参数处理技巧

82fc07ebc0d721f465fb97b86c1fc3de.png

一、前言

我们在开发中经常需要对用户请求参数进行准入校验,比如:校验非空,长度,数字等;另外响应参数我们可能需要统一进行数据转换,比如:将返回的参数修改为用户指定字段,对数据进行取整,四舍五入等。这个时候我们就需要用到统一校验及响应参数统一处理。

二、关于统一校验

服务端的校验我们首先想到的是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;

还有很多其他的处理方式,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值