3

我正在使用 Dropwizard,我想从过滤器中包装一个请求对象,并从我的资源类中访问该实例

例如执行以下操作

过滤器.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);
        }
    }
...

资源.java

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

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

...

这不起作用,我也没有任何理由期望它,但这似乎是解释我试图做什么的好方法。

4

1 回答 1

2

试试这里记录的这个 ContainerFilter: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;
        }
    }
}

只需将其添加到您的应用程序 run() 中:

environment.jersey().getResourceConfig().getContainerRequestFilters().add(new DateNotSpecifiedFilter());
于 2014-10-20T13:16:57.650 回答