Nano Hash - криптовалюты, майнинг, программирование

Можете ли вы выполнить традиционную фильтрацию сервлетов с помощью JAX-RS/Jersey?

Представьте, что у вас есть фильтр, который запускает транзакцию базы данных, обрабатывает запрос, а затем пытается зафиксировать транзакцию.

doFilter(...) {
    ...
    transaction.begin();
    filterChain.doFilter(request, response);
    transaction.commit();
}

При использовании Джерси возникают некоторые проблемы:

  1. Используя фильтр, контейнер сервлетов Джерси фиксирует/сбрасывает ответ до того, как выполнение вернется к вашему фильтру. Итак, если фиксация не удалась, вы не можете изменить код возврата, чтобы он был неудачным. Кроме того, JAX-RS ExceptionMapper не будет перехватывать исключения.
  2. Использование ContainerRequestFilter/ContainerResponseFilter.

    фильтр public ContainerRequest (запрос ContainerRequest) { ... }
    фильтр public ContainerResponse (запрос ContainerRequest, ответ ContainerResponse) { ... }

Это позволяет исключениям подниматься до ExceptionMapper, но разделяет логику на 2 отдельных метода/интерфейса. Проблема в том, что если есть исключение, которое не соответствует ответу, ContainerResponseFilter никогда не вызывается, поэтому вы не можете его очистить.

Каков предпочтительный способ справиться с этим в среде JAX-RS? Есть ли способ настроить очистку ответа или есть класс или интерфейс, который я пропускаю?


  • То, что вы описываете, широко известно как открытый сеанс в представлении (анти-) шаблон. См. этот вопрос SO для обсуждения. Также обратитесь к JBoss (Hibernate/Seam) для дополнительных обсуждений, например. community.jboss.org/docs/DOC-13954 14.05.2013
  • Конечно, есть некоторые споры о том, что именно представляет собой представление, но это всего лишь приложение REST. Методы ресурса jax-rs являются сервисным уровнем и напрямую используют постоянство. Объект ответа является результатом вызова службы. Я пытаюсь избежать управления транзакциями в каждом методе, и ответ будет либо чем-то напоминающим фильтр, либо я подключаю перехват CDI (чего я хотел бы избежать на этом этапе проекта, если смогу). 14.05.2013

Ответы:


1

Я также немного исследовал это для приложения JAX-RS/RESTEasy. Два варианта, которые я рассматривал, прежде чем читать этот вопрос:

  1. Напишите ExceptionMapper<Throwable> (или ExceptionMapper<DaoException> с пользовательским DaoException) и обработайте его там или в ContainerResponseFilter, который будет выполняться, потому что ExceptionMapper<?> обрабатывает все исключения.
  2. Перед transaction.begin() проверьте текущее состояние транзакции и при необходимости откатитесь туда.

С обоими вариантами есть проблемы.

  1. Я нахожу ExceptionMapper<Throwable> слишком широким, в то время как ExceptionMapper<DaoException> может пропустить какое-то другое исключение, снова оставив транзакцию не очищенной.
  2. Откат транзакции при следующем запросе может занять много времени, что может привести к проблемам с блокировкой других транзакций.

Итак, прочитав ваш вопрос, я сейчас думаю:

  • Использование ContainerRequestFilter для запуска транзакций (в сочетании с конструкцией аннотации @NameBinding).
  • Использование ContainerResponseFilter для фиксации транзакций (если ресурсный метод еще не закрыл ее).
  • Используя Filter, убедитесь, что транзакция была закрыта, и если нет, откатите ее.
16.07.2013
  • Как вы понимаете, что ExceptionMapper слишком широк? Если вы просто проверите сессию на активную транзакцию в ExceptionMapper‹Throwable›, вы можете быть уверены, что что-то пошло не так, и выполнить откат. Если нет активной транзакции, ничего не делать. Проблема, которую я вижу, заключается в том, что в случае сбоя transaction.commit() в ContainerResponseFilter объект ответа необходимо будет изменить. Не знаете, что произойдет, если в ContainerResponseFilter возникнет исключение, будет ли оно перехвачено ExceptionMapper? 10.10.2013
  • Слишком широкий в том смысле, что у вас также может быть ExceptionMapper<SpecificException>. Какой ExceptionMapper<?> будет обрабатывать исключение? Сначала для SpecificException, а потом для Throwable? Или последний проглотит SpecificException? 10.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..