Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义bean验证约束和persist()上的验证_Java_Spring_Hibernate_Jpa_Bean Validation - Fatal编程技术网

Java 自定义bean验证约束和persist()上的验证

Java 自定义bean验证约束和persist()上的验证,java,spring,hibernate,jpa,bean-validation,Java,Spring,Hibernate,Jpa,Bean Validation,记住孩子们!!!您应该检查变量是否为null;。很抱歉这个问题有这么简单的答案。大脑滞后是真的! 如果有人知道如何配置persistence.xml在persistence更新之前检查验证,请发表评论,这个问题我还没有解决 我试图在hibernate中创建自定义验证注释。遗憾的是,在使用Validator和ValidatorFactory进行测试期间,我得到了一些信息,遗憾的是,我不知道为什么: javax.validation.ValidationException: HV000028: Un

记住孩子们!!!您应该检查变量是否为null;。很抱歉这个问题有这么简单的答案。大脑滞后是真的! 如果有人知道如何配置persistence.xml在persistence更新之前检查验证,请发表评论,这个问题我还没有解决

我试图在hibernate中创建自定义验证注释。遗憾的是,在使用Validator和ValidatorFactory进行测试期间,我得到了一些信息,遗憾的是,我不知道为什么:

javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
这是我的注解:

@Documented
@Constraint(validatedBy=PeselValidator.class)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyPesel {
    String message() default "{wrong.pesel.format}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
public class PeselValidator implements ConstraintValidator<MyPesel,String>{

    @Override
    public boolean isValid(String arg0, ConstraintValidatorContext arg1) {
        IF(ARG0==NULL)
RETURN FALSE; //!!!!!!!!!!!!!!
        //arg0.matches("^\\d{4}[1-31]\\d{5}$")
        if(arg0.length()==11)  
            return true;
        else
            return false;
    }

}

在这种情况下,我相信您可以使用@Pattern注释

根据我的经验,编写自定义注释只会使事情变得更加复杂,而hibernate提供的验证对您可能需要的一切都有好处


其他一切都应该在上面的层中处理。

为什么不使用@Length验证呢?看,实际上我只留了长度,让事情更简单。还有更复杂的情况,包括regrex。你是对的。我想试着做我自己的注释,但没有复杂的例子出现在我的绑定中,所以我决定这样做。无论如何,谢谢你的替代方案!!!
@Entity
public class Author {
    @Id
    @GeneratedValue
    private int Id;

    @NotNull
    @Size(min=5,max=30)
    private String name;

    @NotNull
    @MyPesel
    private String pesel;

    @ManyToMany
    @JoinColumn(name="book_id")
    private Collection<Book> book= new ArrayList<>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPesel() {
        return pesel;
    }

    public void setPesel(String pesel) {
        this.pesel = pesel;
    }
}
@Test
    public void goodBookBadAuthor() {
        Book book=new Book();
        book.setTitle("quite good title");
        book.getAuthor().add(new Author());
        Author author=new Author();
        author.setName("y");
        author.setPesel("abc");
        book.getAuthor().add(author);
        Validator validator=validatorFactory.getValidator();

        Set<ConstraintViolation<Book>> constraintViolations=validator.validate(book);

        assertEquals(2,constraintViolations.size());
    }
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">

    <persistence-unit name="ormBook">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>bean.Book</class>
        <class>bean.Author</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />

            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://127.0.0.1:3307/db_hibernate_3?useSSL=true&amp;serverTimezone=UTC&amp;logger=Slf4JLogger&amp;profileSQL=true" />

            <property name="javax.persistence.jdbc.user" value="root" />

            <property name="javax.persistence.jdbc.password" value="jbjb123" />
                  <property name="javax.persistence.validation.mode" value="AUTO"/>
     <property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default" />
       <property name="javax.persistence.validation.group.pre-update" value="javax.validation.groups.Default" />
       <property name="javax.persistence.validation.group.pre-remove" value=""/>       
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />


            <property name="hibernate.connection.isolation" value="2" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
            <property name="hibernate.connection.pool_size" value="10" />
        </properties>
    </persistence-unit>

</persistence>