每个表单域

时间:2017-03-17 19:10:04

标签: spring-boot jackson

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

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

如所见,该字段不是必需的。但在前端用户希望清除现场。然后由于长度限制,表单验证失败。传入数据是空字符串而不是空字符串。因此,最小长度验证会限制输入。

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

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

我只想为String字段添加app wide自定义反序列化器。

3 个答案:

答案 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;
        }