Джерси 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 4

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;
    }
}

Затем просто зарегистрируйте фильтр.