Hibernate Validator method or constructor validation

后端 未结 2 1713
Happy的楠姐
Happy的楠姐 2021-01-15 09:16

How can I use Hibernate validator to validate the arguments inside the constructor or method? I want the validation to occur before the ValueObject creation so I can throw a

相关标签:
2条回答
  • 2021-01-15 09:46

    For anyone else that finds this post. I changed my approach slightly and got this working using OVal Validation & AspectJ instead of Hibernate.

    Basically the same example as above except I needed to add @Guarded above the class:

    @Guarded
    public class Person {
        private String name;
        private String surname;
        private int age;
    
        public Person(@NotNull String name, @NotNull String surname, @Range(min=100, max=200) int age){
            this.name = name;
            this.surname = surname;
            this.age = age;
        }
    }
    

    Then in your build.gradle add:

    buildscript {
        repositories {
            jcenter()
            mavenCentral()
        }
        dependencies {
            classpath 'org.aspectj:aspectjtools:1.8.10'
        }
    }
    dependencies {
        compile 'org.aspectj:aspectjrt:1.8.1'
        compile 'net.sf.oval:oval:1.86'
    }
    
    tasks.withType(JavaCompile) {
        doLast {
            String[] args = ["-showWeaveInfo",
                             "-1.8",
                             "-inpath", destinationDir.toString(),
                             "-aspectpath", classpath.asPath,
                             "-d", destinationDir.toString(),
                             "-classpath", classpath.asPath]
    
            MessageHandler handler = new MessageHandler(true);
            new Main().run(args, handler)
        }
    
    0 讨论(0)
  • 2021-01-15 09:53

    You can do like this with hibernate validator using refection to validate the arguments:

    public class PersonTest {
    
    private static ExecutableValidator executableValidator;
    
    @BeforeClass
    public static void setUp() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        executableValidator = factory.getValidator().forExecutables();
    }
    @Test
    public void test() throws NoSuchMethodException {
        Constructor<Person> constructor = 
               Person.class.getConstructor(String.class, String.class, int.class);
    
        Set<ConstraintViolation<Person>> violations = 
             executableValidator.validateConstructorParameters(constructor, new Object[]{null, "", 12});
             assertEquals(2, violations.size());
        }
    }
    
    0 讨论(0)
提交回复
热议问题