【问题标题】:Spring Boot String Deserializer for every form field每个表单字段的 Spring Boot 字符串反序列化器
【发布时间】:2017-03-17 19:10:03
【问题描述】:

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

@Size(min = 4, max = 20)
private String mobile;

正如所见,该字段不是必需的。但是在前端用户想要清除字段。然后由于长度限制,表单验证失败。传入的数据是一个空字符串而不是 null。所以最小长度验证限制了输入。

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

添加@JsonDeserialize(using = CustomTrimDeserializer.class) 注释或为每个字符串字段编写自定义设置器不是 DRY 解决方案。

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

【问题讨论】:

    标签: spring-boot jackson


    【解决方案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】:

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

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

      【讨论】:

        【解决方案3】:

        如下创建一个类并使用@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;
                }
        

        【讨论】:

          猜你喜欢
          • 2015-09-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-07
          • 2021-01-08
          • 1970-01-01
          • 2023-03-23
          • 2020-01-09
          • 2021-05-18
          相关资源
          最近更新 更多