我正在尝试使用dropwizard实现RequestDispatcher,该应用程序应该查看帖子正文中的Entity并计算某些统计信息。

因此,我实现了一个ResourceMethodDispatchAdapterResourceMethodDispatchProvider,并且能够成功注入并调用我的RequestDispatcher,

 private static class InspectRequestDispatcher implements RequestDispatcher {

    private final RequestDispatcher dispatcher;

    private InspectRequestDispatcher(RequestDispatcher dispatcher) {
        this.dispatcher = dispatcher;
    }

    @Override
    public void dispatch(final Object resource, final HttpContext context) {
        final Saying day = context.getRequest().getEntity(Saying.class);
        dispatcher.dispatch(resource, context); // this throws ConstraintViolationException
    }
}

上面的代码引发异常,因为我已经读取了主体(这是可以理解的),所以我可以重置流,但是随后我将为读取两次主体付出代价。

是否可以在注入了AFTER参数之后拦截方法调用?不知何故安排此拦截器为最后一个?

使用dropwizard 7版本

最佳答案

如果您要使用 ContainerRequestFilter 而不是RequestDispatcher,则可以利用 CachedEntityContainerRequest 来实现此目的。

缓存的实体入站HTTP请求,该请求缓存从适配的容器请求中获得的实体实例。
如果过滤器需要特定类型的实体,并且资源方法也将使用相同的类型,则它可以使用此类。

您基本上会像这样使用它:

@Provider
public class StatsFilter implements ContainerRequestFilter {
    @Override
    public ContainerRequest filter(ContainerRequest request) {
        final CachedEntityContainerRequest cachedRequest
                = new CachedEntityContainerRequest(request);

        final Saying saying = cachedRequest.getEntity(Saying.class);

        return cachedRequest;
    }
}
然后只需注册过滤器。

09-26 12:34