【问题标题】:@NotEmpty and @notNull not working during deserialization@NotEmpty 和 @notNull 在反序列化期间不起作用
【发布时间】:2022-01-20 09:17:28
【问题描述】:

我有一段代码将 json 字符串反序列化为模型对象,但是我提供了 @NotNull 和 @NotEmpty 验证但它不起作用,下面是代码:-

   private Student getDecryptedRequestData(String studentRequest) throws JsonParseException, JsonMappingException, IOException {
    
    return  new ObjectMapper().readValue(studentRequest,Student.class);
}

学生.java

   import javax.validation.constraints.NotEmpty;
   import javax.validation.constraints.NotNull;

   import com.fasterxml.jackson.annotation.JsonProperty;

   public class Student{


    @NotEmpty
    private String studentName;

    @NotNull
    private Long roll;

   public String getStudentName() {
    return studentName;
   }

public void setStudentName(String studentName) {
    this.studentName= studentName;
}


public Long getRoll() {
    return roll;
}

public void setRoll(Long roll) {
    this.duration = roll;
}

}

【问题讨论】:

  • 这些用于验证,正如您所注意到的,在反序列化时不会应用。如果您让 spring 进行编组(假设您是从网络接收到的),您可以在对象被反序列化后使用 @Valid 进行验证。
  • 你能告诉我在哪里可以使用@Valid,这个调用不在控制器上,它直接在服务中
  • 这个服务怎么称呼?有什么东西触发了这个,我假设控制器最终会这样做。如果不是,您需要手动进行验证,方法是注入验证器并调用 validate。
  • 我正在解密一个 JSON 字符串,然后反序列化为一个模型对象,所以我想验证模型对象是否没有任何变量 empty/null。
  • 如果您使用 spring-boot 并包含 spring-boot-configuration-processor,如果 spring 构建用于自动装配或配置的对象,则将考虑这些注释。但是jackson本身并没有使用它!

标签: java spring-boot jackson


【解决方案1】:

使用下面的代码,它工作并在 POJO 的构造函数中添加了@JsonCreator

    ObjectMapper mapper = new ObjectMapper();
 mapper.configure(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES, true);

【讨论】:

    【解决方案2】:

    在您返回 Student 之前,您可以使用

    Validation.buildDefaultValidatorFactory().getValidator().validate(Student);
    

    或使用组件

     @Component
    @Slf4j
    public class ValidatorUtils {
        private final ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        private final Validator validator = validatorFactory.getValidator();
    
        public <T> void checkValid(T object, Class<?>... groups) {
            Set<ConstraintViolation<T>> set = validator.validate(object, groups);
            if (CollectionUtils.isNotEmpty(set)) {
                throw new ConstraintViolationException(set);
            }
        }
    
    }
    

    【讨论】:

    • 请在您的答案中添加一些支持信息,并使用代码工具来格式化您的代码。
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2020-10-16
    • 2012-09-18
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多