Dropwizard Validation Support - provides enhanced validation capabilities for Dropwizard applications
npx @tessl/cli install tessl/maven-io-dropwizard--dropwizard-validation@3.0.0Dropwizard Validation provides comprehensive validation support for Dropwizard applications, extending beyond standard Jakarta Bean Validation (JSR-303) with custom validators and annotations. It includes specialized validators for Dropwizard-specific types such as Duration and DataSize ranges, port ranges, and value constraints, along with self-validation capabilities and advanced constraint violation handling.
pom.xml:<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-validation</artifactId>
<version>3.0.14</version>
</dependency>import io.dropwizard.validation.*;
import io.dropwizard.validation.selfvalidating.*;For specific validation annotations:
import io.dropwizard.validation.DurationRange;
import io.dropwizard.validation.DataSizeRange;
import io.dropwizard.validation.OneOf;
import io.dropwizard.validation.PortRange;
import io.dropwizard.validation.Validated;import io.dropwizard.validation.*;
import io.dropwizard.util.Duration;
import io.dropwizard.util.DataSize;
import io.dropwizard.util.DataSizeUnit;
import javax.validation.constraints.NotNull;
import java.util.concurrent.TimeUnit;
public class ServerConfig {
@NotNull
@DurationRange(min = 1, max = 30, unit = TimeUnit.SECONDS)
private Duration timeout;
@DataSizeRange(min = 1, max = 1024, unit = DataSizeUnit.MEGABYTES)
private DataSize maxFileSize;
@PortRange(min = 8080, max = 9999)
private int serverPort;
@OneOf(value = {"development", "staging", "production"}, ignoreCase = true)
private String environment;
// getters and setters...
}
// Validate using standard Bean Validation
import javax.validation.Validator;
Validator validator = BaseValidator.newValidator();
Set<ConstraintViolation<ServerConfig>> violations = validator.validate(config);The validation framework is built on several key components:
This modular design integrates seamlessly with Dropwizard's configuration system and JAX-RS resource validation, providing both declarative annotation-based validation and programmatic validation capabilities.
Core utilities for creating validators and formatting constraint violations, providing the foundation for all validation operations in Dropwizard applications.
public class BaseValidator {
public static Validator newValidator();
public static HibernateValidatorConfiguration newConfiguration();
}
public class ConstraintViolations {
public static <T> String format(ConstraintViolation<T> v);
public static <T> Collection<String> format(Set<ConstraintViolation<T>> violations);
public static Collection<String> formatUntyped(Set<ConstraintViolation<?>> violations);
public static <T> Set<ConstraintViolation<?>> copyOf(Set<ConstraintViolation<T>> violations);
}Specialized validation annotations and validators for Dropwizard Duration objects, supporting minimum, maximum, and range constraints with configurable time units.
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
public @interface DurationRange {
long min() default 0;
long max() default Long.MAX_VALUE;
TimeUnit unit() default TimeUnit.SECONDS;
String message() default "must be between {min} {unit} and {max} {unit}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = MinDurationValidator.class)
public @interface MinDuration {
long value();
TimeUnit unit() default TimeUnit.SECONDS;
boolean inclusive() default true;
String message() default "must be greater than ${inclusive == true ? 'or equal to ' : ''}{value} {unit}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = MaxDurationValidator.class)
public @interface MaxDuration {
long value();
TimeUnit unit() default TimeUnit.SECONDS;
boolean inclusive() default true;
String message() default "must be less than ${inclusive == true ? 'or equal to ' : ''}{value} {unit}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}Validation annotations and validators for Dropwizard DataSize objects, enabling constraints on file sizes, memory limits, and other size-based configurations.
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
public @interface DataSizeRange {
long min() default 0;
long max() default Long.MAX_VALUE;
DataSizeUnit unit() default DataSizeUnit.BYTES;
String message() default "must be between {min} {unit} and {max} {unit}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = MinDataSizeValidator.class)
public @interface MinDataSize {
long value();
DataSizeUnit unit() default DataSizeUnit.BYTES;
String message() default "must be greater than or equal to {value} {unit}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = MaxDataSizeValidator.class)
public @interface MaxDataSize {
long value();
DataSizeUnit unit() default DataSizeUnit.BYTES;
String message() default "must be less than or equal to {value} {unit}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}Annotations for validating string values against allowed sets and numeric values against port ranges, with support for case-insensitive and whitespace-tolerant matching.
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = OneOfValidator.class)
public @interface OneOf {
String[] value();
boolean ignoreCase() default false;
boolean ignoreWhitespace() default false;
String message() default "must be one of {value}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target({METHOD, FIELD, ANNOTATION_TYPE, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = PortRangeValidator.class)
public @interface PortRange {
int min() default 1;
int max() default 65535;
String message() default "{org.hibernate.validator.constraints.Range.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}A framework enabling objects to define custom validation logic through annotated methods, providing flexibility for complex business rules that cannot be expressed with standard validation annotations.
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SelfValidatingValidator.class)
public @interface SelfValidating {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SelfValidation {
}
public class ViolationCollector {
public void addViolation(String message);
public void addViolation(String message, Map<String, Object> messageParameters);
public void addViolation(String propertyName, String message);
public void addViolation(String propertyName, String message, Map<String, Object> messageParameters);
public void addViolation(String propertyName, Integer index, String message);
public void addViolation(String propertyName, Integer index, String message, Map<String, Object> messageParameters);
public void addViolation(String propertyName, String key, String message);
public void addViolation(String propertyName, String key, String message, Map<String, Object> messageParameters);
public boolean hasViolationOccurred();
public void setViolationOccurred(boolean violationOccurred);
public ConstraintValidatorContext getContext();
}Annotations and utilities for validating method parameters and enabling bean predicate validation, supporting advanced validation scenarios beyond field-level constraints.
@Target({PARAMETER, METHOD})
@Retention(RUNTIME)
public @interface Validated {
Class<?>[] value() default {Default.class};
}
@Target({TYPE, ANNOTATION_TYPE, METHOD})
@Retention(RUNTIME)
@Constraint(validatedBy = MethodValidator.class)
public @interface ValidationMethod {
String message() default "is not valid";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}// Core utility classes are part of the base validation capability
// Value extractors and interpolation helpers support the validation framework
// All validator implementations are internal and not part of the public API