10 — Validation

Built-in Validation Rules

rulii ships with 39+ ready-to-use validation rules. Each one checks a specific constraint and adds a RuleViolation when the check fails.

Available Validation Rules

Rule What It Checks
NotNullValidationRuleValue is not null
NotEmptyValidationRuleString/Collection is not empty
NotBlankValidationRuleString is not blank (not null, not empty, not whitespace)
SizeValidationRuleString/Collection size is within range
MinValidationRuleNumber ≥ minimum
MaxValidationRuleNumber ≤ maximum
DecimalMinValidationRuleDecimal ≥ minimum
DecimalMaxValidationRuleDecimal ≤ maximum
EmailValidationRuleValid email format
UrlValidationRuleValid URL format
PatternValidationRuleMatches a regex pattern
AssertTrueValidationRuleValue is true
AssertFalseValidationRuleValue is false
PositiveValidationRuleNumber > 0
PositiveOrZeroValidationRuleNumber ≥ 0
NegativeValidationRuleNumber < 0
NegativeOrZeroValidationRuleNumber ≤ 0
FutureValidationRuleDate is in the future
FutureOrPresentValidationRuleDate is now or in the future
PastValidationRuleDate is in the past
PastOrPresentValidationRuleDate is now or in the past
DigitsValidationRuleNumber has expected integer/fraction digits
LowerCaseValidationRuleString is all lowercase
UpperCaseValidationRuleString is all uppercase
AlphaValidationRuleString contains only letters
AlphaNumericValidationRuleString contains only letters and digits
NumericValidationRuleString contains only digits
StartsWithValidationRuleString starts with a prefix
EndsWithValidationRuleString ends with a suffix
ContainsValidationRuleString contains a substring

Basic Usage

// Create a validation rule for a field called "name"
NotNullValidationRule notNull = new NotNullValidationRule("name");

// Wrap it as a Rule
Rule rule = Rule.builder().build(notNull);

// Run it
RuleViolations violations = new RuleViolations();
rule.run(name -> null, ruleViolations -> violations);

// Check for errors
violations.hasErrors(); // true — name was null

Collecting Violations

Validation rules automatically add violations to the ruleViolations binding. Pass a RuleViolations instance to collect errors:

RuleSet<?> ruleSet = RuleSet.builder()
    .with("FormValidation")
    .rule(Rule.builder().build(new NotNullValidationRule("name")))
    .rule(Rule.builder().build(new SizeValidationRule("name", 2, 50)))
    .rule(Rule.builder().build(new EmailValidationRule("email")))
    .build();

RuleViolations violations = new RuleViolations();

ruleSet.run(
    name -> "",
    email -> "not-valid",
    ruleViolations -> violations
);

for (RuleViolation v : violations) {
    System.out.println(v.getErrorMessage());
}

Customizing Error Details

// Custom error code and severity
NotNullValidationRule rule = new NotNullValidationRule(
    "name",               // field name
    "ERR-001",            // error code
    Severity.FATAL,       // severity level
    "Name is required!"  // custom message
);