Джерси requestdispatcher порядок выполнения
Я пытаюсь реализовать RequestDispatcher с помощью dropwizard, который должен смотреть на сущность в теле сообщений и вычислять определенные статистики.
Итак, я реализовал 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
}
}
Приведенный выше код выдает исключение, так как я уже прочитал тело ( что понятно ), я мог бы сбросить поток, но тогда я заплачу штраф за чтение тела дважды.
Возможно ли вызов метода перехвата после ввода параметров ? как-то запланировать, чтобы этот перехватчик был последним ?
Использование dropwizard 7 version
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; } }
Затем просто зарегистрируйте фильтр.