【问题标题】:jersey requestdispatcher execution order球衣请求调度程序执行顺序
【发布时间】:2016-10-20 16:42:53
【问题描述】:

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

所以,我实现了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
    }
}

上面的代码抛出异常,因为我已经阅读了正文(这是可以理解的),我可以重置流,但是我会为两次阅读正文付出代价。

是否可以在注入参数后拦截方法调用?以某种方式将此拦截器安排为最后一个?

使用 dropwizard 7 版本

【问题讨论】:

    标签: java jersey jetty dropwizard


    【解决方案1】:

    如果您要使用 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;
        }
    }
    

    然后只需注册过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2016-04-08
      • 1970-01-01
      • 2022-12-24
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      相关资源
      最近更新 更多