Skip to content

Instantly share code, notes, and snippets.

@vicly
Created January 10, 2019 01:25
Show Gist options
  • Save vicly/28db49e4e06ec37a9a852a0a26aa1b6f to your computer and use it in GitHub Desktop.
Save vicly/28db49e4e06ec37a9a852a0a26aa1b6f to your computer and use it in GitHub Desktop.
[Custom bean validation] #Java

Custom constraint and group

@Documented
@ReportAsSingleViolation
@Constraint(validatedBy = { FirstName.Validator.class })
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RUNTIME)
@NotBlank
@Size(min = 1, max = 50)
public @interface FirstName
{

  String message() default "{the.package.FirstName.message}";

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

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

  /**
   * Validator.
   */
  class Validator
      implements ConstraintValidator<PaxFirstName, String>
  {

    @Override
    public void initialize(FirstName constraintAnnotation)
    {
      // do nothing
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context)
    {
      // validation logic here
      // if pass validation, return true, otherwise false
      return true;
    }
  }
}


public interface EmployeeCheck {
}

Run validation

public class Person 
{
	// bound to group "javax.validation.groups.Default.class"
	@FirstName
	private String firstName;
}

public class Employee 
{
	// bound to group "EmployeeChecks.class"
	@FirstName(groups = EmployeeChecks.class)
	private String firstName;
}

Programmatically specificy group

javax.validation.Validator validator = ...;
Employee employee = ...
Person person = ...

// trigger validation
validator.validate(person); // by default to Default.class
validator.validate(person, Default.class);
// NOT run validation
validator.validate(person, EmployeeChecks.class); // Won't auto add Default.class

// trigger validation
validator.validate(employee, EmployeeChecks.class);
validator.validate(employee, Default.class, EmployeeChecks.class);
// NOT run validation
validator.validate(employee);
validator.validate(employee, Default.class);

Declard group in Dropwizard (javax.validation.Valid annotation can't specify group)

public MyResponse processX(@io.dropwizard.validation.Validated({Default.class, ProcessX.class} MyRequest request)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment