Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I access a request that has been wrapped in a custom class from within my Dropwizard Resource?

I am using Dropwizard and I would like to wrap a request object from within a filter, and gain access to that instance from my resource class

e.g. do the following

Filter.java

public class ServiceRequestExtractionFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            HttpServletRequest httpRequest   = (HttpServletRequest) request;

            ProxyResourceRequest requestWrapper = new RequestWrapper(httpRequest, svcRequestData);

            chain.doFilter(requestWrapper, response);
        }
    }
...

Resource.java

@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public class DemoResource {

    @GET
    @Timed
    public Response get(@Context UriInfo uriInfo, @Context RequestWrapper request) {

...

this doesn't work nor do I have any reason to expect it to, but it seemed like a good way to explain what I was trying to do.

like image 241
ben schwartz Avatar asked Feb 03 '26 05:02

ben schwartz


1 Answers

Try this ContainerFilter documented here: http://dropwizard.io/manual/core.html#jersey-filters

public class DateNotSpecifiedFilter implements ContainerRequestFilter {

    @Context ExtendedUriInfo extendedUriInfo;

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        boolean methodNeedsDateHeader = extendedUriInfo.getMatchedMethod().isAnnotationPresent(DateRequired.class);
        String dateHeader = request.getHeaderValue(HttpHeaders.DATE);

        if (methodNeedsDateHeader && dateHeader == null) {
            Exception cause = new IllegalArgumentException("Date Header was not specified");
            throw new WebApplicationException(cause, Response.Status.BAD_REQUEST);
        } else {
            return request;
        }
    }
}

Just add this in you application run():

environment.jersey().getResourceConfig().getContainerRequestFilters().add(new DateNotSpecifiedFilter());
like image 137
user3280180 Avatar answered Feb 04 '26 19:02

user3280180