Spring boot 每个表单字段的Spring引导字符串反序列化器

Spring boot 每个表单字段的Spring引导字符串反序列化器,spring-boot,jackson,Spring Boot,Jackson,在我们的web应用程序中,创建和更新表单具有大小验证。例如: @Size(min = 4, max = 20) private String mobile; 如图所示,该字段不是必需的。但在前端,用户希望清除字段。然后,由于长度限制,表单验证失败。传入数据是空字符串,而不是null。因此,最小长度验证限制了输入 因此,我开始寻找将空字符串转换为空值的解决方案。我找到了@InitBinder和StringTrimmerEditor解决方案,但我们的系统使用@ResponseBody方法。所以它不

在我们的web应用程序中,创建和更新表单具有大小验证。例如:

@Size(min = 4, max = 20)
private String mobile;
如图所示,该字段不是必需的。但在前端,用户希望清除字段。然后,由于长度限制,表单验证失败。传入数据是空字符串,而不是null。因此,最小长度验证限制了输入

因此,我开始寻找将空字符串转换为空值的解决方案。我找到了
@InitBinder
StringTrimmerEditor
解决方案,但我们的系统使用
@ResponseBody
方法。所以它不合适

添加
@JsonDeserialize(使用=CustomTrimDeserializer.class)
注释或为每个字符串字段编写自定义setter不是简单的解决方案


我只想为字符串字段添加应用程序范围的自定义反序列化程序。

您可能只想通过模块(例如,
SimpleModule
)注册自定义反序列化程序,而不是添加
@JsonDeserialize
注释,它将应用于所有
String
值属性。比如:

SimpleModule module = new SimpleModule(...);
module.addDeserializer(String.class, new CustomTrimDeserializer());
mapper.registerModule(module);

最后,我检查了
JsonComponentModule
类,注意到spring正在寻找
JsonComponent
注释以进行反序列化器注册

这是一个解决方案的单文件spring引导项目

@RestController
@SpringBoot应用程序
公共类检查应用程序{
公共静态void main(字符串[]args){
run(CheckNullApplication.class,args);
}
@后映射(“/check null”)
公共布尔checkNull(@RequestBody final HelloForm表单){
返回表单.getName()==null;
}
公共静态类HelloForm{
私有字符串名称;
公共字符串getName(){return name;}
public void setName(最终字符串名){this.name=name;}
}
@JsonComponent
公共静态类StringTrimmerDeserializer扩展JsonDeserializer{
@凌驾
公共字符串反序列化(最终JSONP解析器,最终反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
字符串结果=StringDeserializer.instance.deserialize(p,ctxt);
如果(结果!=null){
result=result.trim();
if(StringUtils.isEmpty(结果)){
返回null;
}
}
返回结果;
}
}
}

创建一个类,如下所示,并用@JsonComponent注释。Spring boot将把它作为一个组件来接收

import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
       @JsonComponent
    public class WhitSpaceTrimmerDeserializer extends StringDeserializer {
    
        @Override
        public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
    
            final String value = super.deserialize(p, ctxt);
            return value!=null?value.trim():null;
        }