新写的项目是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);
}
}