我正在尝试使用dropwizard实现RequestDispatcher,该应用程序应该查看帖子正文中的Entity并计算某些统计信息。
因此,我实现了一个ResourceMethodDispatchAdapter
和ResourceMethodDispatchProvider
,并且能够成功注入并调用我的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;
}
}
然后只需注册过滤器。