【问题标题】:Hibernate Validator With Validation groups for Serialisation With Write AccessHibernate Validator with Validation groups for Serialization with Write Access
【发布时间】:2016-10-18 10:23:42
【问题描述】:

我有一个端点,用户可以使用她的电子邮件/密码进行注册。但是我,想检查密码不为空,但我也只想反序列化密码,因为我不想将它发送回客户端。

public class User {
  @NotEmpty
  private String email;
  @JsonProperty(access = Access.WRITE_ONLY)
  @NotEmpty
  private String password;

  // Getters and setters
  ...
}

端点

@Path("/register")
@POST
public Response register(@Valid User user) {
  ...
}

除了Access.WRITE_ONLY,我还在getter上尝试了@JsonIgnore,在setter上尝试了@JsonProperty

问题是 Hibernate Validator 一直抱怨密码为空,即使我 POST 设置了密码的用户:

"{"errors":["password may not be empty"]}"

我该如何解决这个问题?还是我必须在端点中实现自己的 NotEmpty 验证逻辑?

【问题讨论】:

    标签: java jersey jackson hibernate-validator


    【解决方案1】:

    这可以使用验证组来完成。以下是您将如何实现这一目标:

    public class GroupValidationTest {
    
    
        public static void main(String[] args) {
            Validator v = Validators.newValidator();
    
    
            Model m = new Model();
            m.user = "Harry";
            m.password = "Potter";
    
            Set<ConstraintViolation<Model>> validate = v.validate(m, INPUT.class);
            System.out.println(validate.size());
    
            validate = v.validate(m, INPUT.class, OUTPUT.class);
            System.out.println(validate.size());
    
            validate = v.validate(m, OUTPUT.class);
            System.out.println(validate.size());
    
            m.password = null;
    
            validate = v.validate(m, INPUT.class, OUTPUT.class);
            System.out.println(validate.size());
    
            validate = v.validate(m, OUTPUT.class);
            System.out.println(validate.size());
        }
    
        public static class Model {
    
            @NotEmpty(groups={INPUT.class, OUTPUT.class})
            public String user;
    
            @NotEmpty(groups={INPUT.class})
            public String password;
    
        }
    
        public interface INPUT {}
        public interface OUTPUT {}
    
    }
    

    这个输出:

    0 -> Full object, validate INPUT 
    0 -> Full object, validate INPUT + OUTPUT
    0 -> Full object, validate OUTPUT
    1 -> null password, validate INPUT + OUTPUT
    0 -> null password, validate OUTPUT
    

    解释:

    Hibernate 验证器框架支持用于验证约束的组。它们用于告诉验证器在特定验证尝试中验证哪些组。您可以在这里阅读所有相关信息:

    https://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#example-group-interfaces

    我在代码示例中所做的是:

    • 定义2组INPUTOUTPUT
    • 标记要为两个组验证的用户属性
    • 将密码属性标记为仅在输入时验证

    对于 REST 方面(不同的问题),输入和输出的验证通常由拦截器完成,通常是 MessageBodyReader 和 Writer 类。这些负责读取用户输入并将其写出。您可以在球衣文档页面上阅读相关内容。

    然后您可以实现自己的验证读取器/写入器,它知道在读取用户输入时只验证INPUT,而在写回序列化正文时只验证OUTPUT

    希望对你有帮助

    阿图尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      相关资源
      最近更新 更多