I have a custom validation to check an email field in a class. 

annotation interface: 

```
@ReportAsSingleViolation
@NotBlank
@Email
@Target({ CONSTRUCTOR, FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CustomEmailValidator.class)
@Documented
public @interface CustomEmail {
  String message() default "Failed email validation.";

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

  Class<? extends Payload>[] payload() default {};
}  

```

CustomEmailValidator class:

```
public class CustomEmailValidator implements ConstraintValidator<CustomEmail, String> {

  public void initialize(CustomEmail customEmail) {
    // nothing to initialize
  }

  public boolean isValid(String email, ConstraintValidatorContext arg1) {
    if (email != null) {
    String domain = "example.com";
    String[] emailParts = email.split("@");

      return (emailParts.length == 2 && emailParts[1].equals(domain));
    } else {
      return false;
    }
  }
}  

```

I use a **ValidationMessages.properties** file for all of my custom messages. in the properties file I reference a failure in the above code using: 

```
CustomEmail.email=The provided email can not be added to the account.  

```

The problem is that this error message is used for all failures during validation, so even if the user provided a blank string it will print that message. What I want to do is if the validation fails on `@NotBlank` then print a "required field message", if it fails on `@Email` provide a "invalid email" message. Then only for when it fails the custom validation would it print the `CustomEmail.email` message. Also in my annotation interface do the `@NotBlank` and `@Email` occur in order or are they randomly run. Then what ever validation is run first is returned as the error? My validation requires that they run in the order they are listed `@NotBlank` followed by `@Email` followed by CustomEmail.