Dropwizard Validation Support - provides enhanced validation capabilities for Dropwizard applications
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Dropwizard 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