关于前后端分离时参数校验及精度丢失问题

新写的项目是springboot+vue的前后端分离项目,在前后端联调时出现过种种问题,在此统一汇总:

1、@NotNull注解校验

在后端VO中接收前端参数时,之前的代码是这样的

**
 * Created in 15:28 2021/7/26
 *
 * @Author: Efren
 */
@Data
public class AddDictDataRequestVO {
    /**
     * 字典类型
     */
    @NotNull(message = "字典类型不能为空!")
    private String typeCode;
    /**
     * 字典值
     */
    @NotNull(message = "字典值不能为空!")
    private String code;
    /**
     * 字典名称
     */
    @NotNull(message = "字典名称不能为空!")
    private String name;

    /**
     * 排序
     */
    @Pattern(regexp = "^[0-9]*[1-9][0-9]*$",message = "排序号必须是整数!")
    private Integer orderNo;

    /**
     * 描述
     */
    private String description;
    /**
     * 操作人id
     */
    @NotNull(message = "操作人id不能为空!")
    @JsonDeserialize(using = LongJsonDeserializer.class)
    @JsonSerialize(using = LongJsonSerializer.class)
    private Long mUserId;

但今天在联调时前端传入了空字符串来 例子如下

{
	"typeCode" :""
	
.....以下省略
}

再加上在之后的业务逻辑中也出现了StringUtils的使用,查看日志发现了前端传来了空字符串,@NotNull也并未拦截到,而是参数校验成功,搜集了资料后发现@NotNull只能拦截到null值的传输,也就是说只能拦住下面的情况:

	{
	
	"typeCode" :

	}

或者说是另一种情况

{}

这种都会拦截到

这时建议使用@NotEmpty 这个注解不仅能拦截到空字符串,假如这里需要传入一个List进来时,倘若List的size为0,该注解同样可以拦截到。补充一点 @NotEmpty注解仅对String和List生效,Integer不可以使用该注解。

2 全局配置(处理精度丢失)

  #设置返回日期为字符串
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    #处理web模块返回的long类型(全局转成string)
    generator:
      write-numbers-as-strings: true

该全局配置均为字符串返回,yml文件配置如上所示,需要重点提一下的是第二步web模块也就是我们项目和前端交互的模块,这里存在前端返回Long类型 转为String类型时会产生精度丢失,因此在此仅仅此配置是绝对不够的,第一部分贴出来的VO代码中可以看到Long类型的mUserId字段上有两个注解

@JsonDeserialize(using = LongJsonDeserializer.class)
@JsonSerialize(using = LongJsonSerializer.class)

这两个注解可以完美解决精度丢失的问题,代码如下:

/**
 * Created in 13:27 2021/7/12
 *
 * @Author: Efren
 */
public class LongJsonDeserializer extends JsonDeserializer<Long> {

    @Override
    public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        String value = jsonParser.getText();
        try {
            return value == null ? null : Long.parseLong(value);
        } catch (NumberFormatException e) {
            return null;
        }
    }
}
/**
 * Created in 13:25 2021/7/12
 *
 * @Author: Efren
 */
public class LongJsonSerializer extends JsonSerializer<Long> {

    @Override
    public void serialize(Long aLong, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String text = (aLong == null ? null : String.valueOf(aLong));
        if (text != null) {
            jsonGenerator.writeString(text);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值