import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import static org.junit.Assert.assertTrue; import java.lang.annotation.Retention; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.Payload; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.constraints.NotNull; import org.junit.Test; @ValidatorTest.MyConstraint public class ValidatorTest { @NotNull private String property; @Test public void test() { final Validator validator = Validation.byDefaultProvider().configure().buildValidatorFactory().getValidator(); assertTrue(validator.validateValue(ValidatorTest.class, "property", "Test").isEmpty()); } @Target({ TYPE }) @Retention(RUNTIME) @Constraint(validatedBy = MyValidator.class) public @interface MyConstraint { String message() default "Person is not valid."; Class[] groups() default {}; Class[] payload() default {}; } public static class MyValidator implements ConstraintValidator { @Override public boolean isValid(final ValidatorTest test, final ConstraintValidatorContext context) { return true; } } }