Dropwizard Jersey Support - Jersey integration module for the Dropwizard Java framework
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Dropwizard Jersey provides comprehensive Jersey REST framework integration for Dropwizard applications. It offers type-safe parameter converters, session management, validation integration, optional handling, standardized error handling, HTTP caching, GZIP compression, and Jackson JSON processing to build robust RESTful web services.
pom.xml:<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-jersey</artifactId>
<version>4.0.14</version>
</dependency>import io.dropwizard.jersey.DropwizardResourceConfig;
import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.jersey.params.*;
import io.dropwizard.jersey.sessions.Session;
import io.dropwizard.jersey.sessions.Flash;
import io.dropwizard.jersey.validation.Validators;
import io.dropwizard.jersey.caching.CacheControl;
import io.dropwizard.jersey.PATCH;import io.dropwizard.jersey.DropwizardResourceConfig;
import io.dropwizard.jersey.setup.JerseyEnvironment;
import io.dropwizard.jersey.params.UUIDParam;
import io.dropwizard.jersey.sessions.Session;
import io.dropwizard.jersey.caching.CacheControl;
import io.dropwizard.jersey.PATCH;
import jakarta.servlet.http.HttpSession;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
// Configure Jersey with Dropwizard enhancements
DropwizardResourceConfig config = new DropwizardResourceConfig();
JerseyEnvironment jersey = new JerseyEnvironment(holder, config);
// Register a resource
jersey.register(UserResource.class);
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
public class UserResource {
// Type-safe parameter handling
@GET
@Path("/{id}")
public User getUser(@PathParam("id") UUIDParam userId) {
UUID id = userId.get(); // Automatic parsing and validation
return userService.findById(id);
}
// Session management
@POST
@Path("/{id}/preferences")
public void savePreferences(@PathParam("id") UUIDParam userId,
@Session HttpSession session,
UserPreferences prefs) {
session.setAttribute("userId", userId.get());
userService.savePreferences(userId.get(), prefs);
}
// HTTP caching
@GET
@Path("/public")
@CacheControl(maxAge = 300, maxAgeUnit = TimeUnit.SECONDS)
public List<User> getPublicUsers() {
return userService.getPublicUsers();
}
// PATCH method support
@PATCH
@Path("/{id}")
public User updateUser(@PathParam("id") UUIDParam userId,
UserUpdate update) {
return userService.updateUser(userId.get(), update);
}
}Dropwizard Jersey is built around several key components:
DropwizardResourceConfig extends Jersey's ResourceConfig with Dropwizard-specific providers and featuresJerseyEnvironment provides a simplified interface for Jersey configurationErrorMessage format and exception mappersCore Jersey framework integration providing the main configuration classes and environment setup for Dropwizard applications.
public class DropwizardResourceConfig extends ResourceConfig {
public DropwizardResourceConfig();
public DropwizardResourceConfig(MetricRegistry metricRegistry);
public static DropwizardResourceConfig forTesting();
public static DropwizardResourceConfig forTesting(MetricRegistry metricRegistry);
public String getUrlPattern();
public void setUrlPattern(String urlPattern);
public String getContextPath();
public void setContextPath(String contextPath);
public ResourceConfig register(Object component);
}
public class JerseyEnvironment {
public void register(Object component);
public void register(Class<?> componentClass);
public void packages(String... packages);
public void enable(String featureName);
public void disable(String featureName);
public void property(String name, Object value);
public <T> T getProperty(String name);
public DropwizardResourceConfig getResourceConfig();
}Type-safe parameter converters for common data types with automatic parsing, validation, and error handling for JAX-RS resource methods.
public abstract class AbstractParam<T> {
protected AbstractParam(String input);
protected AbstractParam(String input, String parameterName);
public T get();
protected abstract T parse(String input) throws Exception;
protected String errorMessage(Exception e);
}
public class UUIDParam extends AbstractParam<UUID> {
public UUIDParam(String input);
public UUIDParam(String input, String parameterName);
}
public class IntParam extends AbstractParam<Integer> {
public IntParam(String input);
public IntParam(String input, String parameterName);
}
public class LongParam extends AbstractParam<Long> {
public LongParam(String input);
public LongParam(String input, String parameterName);
}
public class NonEmptyStringParam extends AbstractParam<String> {
public NonEmptyStringParam(String input);
public NonEmptyStringParam(String input, String parameterName);
}HTTP session integration with injection support and flash message capabilities for web applications requiring session state.
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Session {
boolean doNotCreate() default false;
}
public class Flash<T> {
public Optional<T> get();
public void set(T value);
}
public class HttpSessionFactory implements Factory<HttpSession> {
public HttpSession provide();
}
public class FlashFactory implements Factory<Flash<?>> {
public Flash<?> provide();
}Standardized error handling with consistent error message format and exception mappers for common exceptions.
public class ErrorMessage {
public ErrorMessage(String message);
public ErrorMessage(int code, String message);
public ErrorMessage(int code, String message, String details);
public Integer getCode();
public String getMessage();
public String getDetails();
}
public class LoggingExceptionMapper<E extends Throwable> implements ExceptionMapper<E> {
public Response toResponse(E exception);
}
public class IllegalStateExceptionMapper implements ExceptionMapper<IllegalStateException> {
public Response toResponse(IllegalStateException exception);
}Hibernate Validator integration providing comprehensive validation support for JAX-RS resources with custom parameter extractors.
public class Validators {
public static Validator newValidator();
public static ValidatorFactory newValidatorFactory();
public static HibernateValidatorConfiguration newConfiguration();
}
public class JerseyViolationException extends ValidationException {
public JerseyViolationException(Set<ConstraintViolation<?>> violations);
public Set<ConstraintViolation<?>> getConstraintViolations();
}
public class ValidationErrorMessage {
public List<String> getErrors();
public ValidationErrorMessage(Collection<String> errors);
}Support for Java 8 Optional and Guava Optional types with automatic serialization and 404 responses for empty values.
public class OptionalMessageBodyWriter implements MessageBodyWriter<Optional<?>> {
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType);
public void writeTo(Optional<?> entity, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream);
}
public class EmptyOptionalException extends WebApplicationException {
public EmptyOptionalException();
public EmptyOptionalException(String message);
}
public class OptionalIntMessageBodyWriter implements MessageBodyWriter<OptionalInt> {
public void writeTo(OptionalInt entity, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream);
}HTTP caching support through annotations with comprehensive Cache-Control header configuration for optimizing web service performance.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheControl {
boolean immutable() default false;
boolean isPrivate() default false;
boolean noCache() default false;
boolean noStore() default false;
boolean noTransform() default true;
boolean mustRevalidate() default false;
boolean proxyRevalidate() default false;
int maxAge() default -1;
TimeUnit maxAgeUnit() default TimeUnit.SECONDS;
int staleWhileRevalidate() default -1;
TimeUnit staleWhileRevalidateUnit() default TimeUnit.SECONDS;
int sharedMaxAge() default -1;
TimeUnit sharedMaxAgeUnit() default TimeUnit.SECONDS;
}
public class CacheControlledResponseFeature implements Feature {
public boolean configure(FeatureContext context);
}Parameter converters for Java 8 date/time API types providing type-safe parsing of date and time values from HTTP requests.
public class InstantParam extends AbstractParam<Instant> {
public InstantParam(String input);
public InstantParam(String input, String parameterName);
}
public class LocalDateParam extends AbstractParam<LocalDate> {
public LocalDateParam(String input);
public LocalDateParam(String input, String parameterName);
}
public class LocalDateTimeParam extends AbstractParam<LocalDateTime> {
public LocalDateTimeParam(String input);
public LocalDateTimeParam(String input, String parameterName);
}
public class ZonedDateTimeParam extends AbstractParam<ZonedDateTime> {
public ZonedDateTimeParam(String input);
public ZonedDateTimeParam(String input, String parameterName);
}// Common interfaces
public interface Factory<T> {
T provide();
}
// Exception types
public class WebApplicationException extends RuntimeException {
public WebApplicationException(String message, int status);
public WebApplicationException(String message, Response.Status status);
}
// Validation types
public interface ConstraintViolation<T> {
String getMessage();
String getPropertyPath();
T getRootBean();
Object getInvalidValue();
}
// Time units for caching
public enum TimeUnit {
NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS;
}
// HTTP method annotation
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}