Close

Java Bean Validation - Using Constraint Annotations in Superclasses and Interfaces (Constraint Inheritance)

[Last Updated: Sep 12, 2021]

The constraint annotations can be placed in an interface or a superclass hierarchy. The constraint annotations are applied cumulatively. Constraints declared in a superclass getter are validated along with any constraints defined on an overridden version of the getter.

Example

package com.logicbig.example;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

public interface Employee {

    String getName();

    @Valid
    @NotNull
    PhoneNumber getPhoneNumber();

    @NotNull
    String getDept();
}
package com.logicbig.example;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

public class PhoneNumber {
    @NotNull
    private String type;
    @Pattern(regexp = "\\d{3}-\\d{3}-\\d{4}")
    private String number;
    .............
}
package com.logicbig.example;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class Person {
    @NotNull
    @Size(min = 1, max = 300)
    private String name;
    .............
}
package com.logicbig.example;

public class EmployeeImpl extends Person implements Employee{
    private PhoneNumber phoneNumber;
    private String dept;
    .............
}

The main class

package com.logicbig.example;

import javax.validation.*;
import java.util.Comparator;
import java.util.Set;

public class ExampleMain {
    public static void main(String[] args) {
        Validator validator = createValidator();
        Employee employee = new EmployeeImpl("",
                new PhoneNumber("cell", "234-3334"), null);
        Set<ConstraintViolation<Employee>> violations = validator.validate(employee);
        violations.stream().sorted(Comparator.comparing(o -> o.getPropertyPath().toString()))
                .forEach(ExampleMain::printError);
    }

    private static void printError(ConstraintViolation<?> violation) {
        System.out.println(violation.getPropertyPath()
                + " " + violation.getMessage());
    }

    private static Validator createValidator() {
        Configuration<?> config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();
        return validator;
    }
}

Output

dept must not be null
name size must be between 1 and 300
phoneNumber.number must match "\d{3}-\d{3}-\d{4}"

Example Project

Dependencies and Technologies Used:

  • hibernate-validator 6.2.0.Final (Hibernate's Jakarta Bean Validation reference implementation)
     Version Compatibility: 5.0.0.Final - 6.2.0.Final Version List
    ×

    Version compatibilities of hibernate-validator with this example:

      groupId: org.hibernate
      artifactId: hibernate-validator
      Reference implementation for Bean Validation 1.1
    • 5.0.0.Final
    • 5.0.1.Final
    • 5.0.2.Final
    • 5.0.3.Final
    • 5.1.0.Final
    • 5.1.1.Final
    • 5.1.2.Final
    • 5.1.3.Final
    • 5.2.0.Final
    • 5.2.1.Final
    • 5.2.2.Final
    • 5.2.3.Final
    • 5.2.4.Final
    • 5.2.5.Final
    • 5.3.0.Final
    • 5.3.1.Final
    • 5.3.2.Final
    • 5.3.3.Final
    • 5.3.4.Final
    • 5.3.5.Final
    • 5.3.6.Final
    • 5.4.0.Final
    • 5.4.1.Final
    • 5.4.2.Final
    • 5.4.3.Final
    • groupId: org.hibernate.validator
      artifactId: hibernate-validator
      Reference implementation for Bean Validation 2.0
    • 6.0.0.Final
    • 6.0.1.Final
    • 6.0.2.Final
    • 6.0.3.Final
    • 6.0.4.Final
    • 6.0.5.Final
    • 6.0.6.Final
    • 6.0.7.Final
    • 6.0.8.Final
    • 6.0.9.Final
    • 6.0.10.Final
    • 6.0.11.Final
    • 6.0.12.Final
    • 6.0.13.Final
    • 6.0.14.Final
    • 6.0.15.Final
    • 6.0.16.Final
    • 6.0.17.Final
    • 6.0.18.Final
    • 6.0.19.Final
    • 6.0.20.Final
    • 6.0.21.Final
    • 6.0.22.Final
    • 6.1.0.Final
    • 6.1.1.Final
    • 6.1.2.Final
    • 6.1.3.Final
    • 6.1.4.Final
    • 6.1.5.Final
    • 6.1.6.Final
    • 6.1.7.Final
    • 6.2.0.Final
    • Version 7 and later:
      Jakarta Bean Validation 3.0
      jakarta.* packages

    Versions in green have been tested.

  • javax.el-api 3.0.0 (Expression Language 3.0 API)
  • javax.el 2.2.6 (Expression Language 2.2 Implementation)
  • JDK 8
  • Maven 3.8.1

Constraint Inheritance Validation Example Select All Download
  • constraint-inheritance-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • Employee.java

    See Also