【问题标题】:Why @Constraints annotation are not working on my tests?为什么@Constraints 注释在我的测试中不起作用?
【发布时间】:2016-11-05 10:04:28
【问题描述】:

我创建了这个User 类:

@Entity
public class User extends Model {

    @Id
    @Constraints.Email
    public String email;

    @Constraints.MinLength(3)
    @Constraints.MaxLength(255)
    public String firstName;

    @Constraints.MinLength(3)
    @Constraints.MaxLength(255)
    public String lastName;

    @Constraints.MinLength(3)
    @Constraints.MaxLength(255)
    public String username;

    @Constraints.MinLength(16)
    @Constraints.MaxLength(255)
    public String password;

    public static Finder<String, User> finder = new Finder<>(User.class);

    public static User create(User user){
        user.password = BCrypt.hashpw(user.password, BCrypt.gensalt(12));
        user.save();
        return user;
        }
     ...
}

我注意到我可以保存一个 empty User。这意味着,没有email,什么都没有,这个用户将被持久化在我的数据库中。

    @Test
    public void createEmptyUser(){
        User user = new User();
        user.email="";
        user.save();

        assertTrue(user.email.isEmpty());
        assertNotNull(User.finder.byId(user.email));
        assertEquals(true, User.findByEmail(user.email).isPresent());
    }

为什么我的测试通过了?

【问题讨论】:

    标签: java playframework annotations playframework-2.0 ebean


    【解决方案1】:

    正如我在这里看到的https://github.com/playframework/playframework/blob/master/framework/src/play-java-forms/src/main/java/play/data/validation/Constraints.java EmailValidator 类的isValid 方法,如果它的agrument 是一个空字符串,则返回true:

    public static class EmailValidator extends Validator<String> implements ConstraintValidator<Email, String> {
    
            public boolean isValid(String object) {
    
                if(object == null || object.length() == 0) {
                    return true;
                }
    
                return regex.matcher(object).matches();
            }
    }
    

    考虑将@Constraints.Required@Formats.NonEmpty添加到此验证中。此外,您可以看到 MinLengthMaxLength 验证器的行为方式相同。

    【讨论】:

    • 我已经尝试过您的建议,但没有成功。还是谢谢你!
    • 没错!其他字段至少期望最小值,我不明白为什么会这样。
    • 从我的角度来看,如果 agrument 的长度为零,则在 MinLength 验证器中始终返回 true 是不正确的。以及空电子邮件不是正确的电子邮件。如果参数是null,我可以理解返回true;但如果它是空字符串,则不是。因此,Play 框架的可能错误可能是:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2019-02-17
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多