在我们的网络应用中,创建和更新表单都有大小验证。例如:
@Size(min = 4, max = 20)
private String mobile;
如所见,该字段不是必需的。但在前端用户希望清除现场。然后由于长度限制,表单验证失败。传入数据是空字符串而不是空字符串。因此,最小长度验证会限制输入。
因此,我开始搜索解决方案,将空字符串转换为空值。我找到了@InitBinder
和StringTrimmerEditor
解决方案,但我们的系统使用@ResponseBody
方法。所以它不适合。
为每个字符串字段添加@JsonDeserialize(using = CustomTrimDeserializer.class)
注释或编写自定义setter不是DRY解决方案。
我只想为String字段添加app wide自定义反序列化器。
答案 0 :(得分:1)
您可能只想通过模块注册自定义反序列化器(例如,@JsonDeserialize
),而不是添加SimpleModule
注释,它将应用于所有String
值的属性。类似的东西:
SimpleModule module = new SimpleModule(...);
module.addDeserializer(String.class, new CustomTrimDeserializer());
mapper.registerModule(module);
答案 1 :(得分:1)
我终于检查了JsonComponentModule
类,并注意到spring正在寻找用于反序列化器注册的JsonComponent
注释。
这是解决方案的单文件spring boot项目
@RestController
@SpringBootApplication
public class CheckNullApplication {
public static void main(String[] args) {
SpringApplication.run(CheckNullApplication.class, args);
}
@PostMapping("/check-null")
public boolean checkNull(@RequestBody final HelloForm form) {
return form.getName() == null;
}
public static class HelloForm {
private String name;
public String getName() { return name; }
public void setName(final String name) { this.name = name;}
}
@JsonComponent
public static class StringTrimmerDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(final JsonParser p, final DeserializationContext ctxt)
throws IOException, JsonProcessingException {
String result = StringDeserializer.instance.deserialize(p, ctxt);
if (result != null) {
result = result.trim();
if (StringUtils.isEmpty(result)) {
return null;
}
}
return result;
}
}
}
答案 2 :(得分:0)
按如下所示创建一个类,并使用@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;
}