Как я могу подражать вперед на 404 в Джерси? - PullRequest
0 голосов
/ 01 апреля 2012

Проблема вкратце:

  • GET на pictures/pic.png сначала нужно обработать Джерси, а затем самому коту
  • Причины:
    1. Кот знает, когда отправить 304 Not Modified. (Ответ зависит от клиента)
    2. pic.png может потребоваться обновление. Обновление должно произойти, когда сделан звонок на картинку.

Длинное объяснение:

У меня есть изображение по указанному URL. Картинка может нуждаться в обновлении. Я хочу сделать проверку свежести во время запроса. Поэтому я кодировал ресурс джерси, обрабатывающий запрос по URL-адресу изображения. При необходимости обновляет изображение в файловой системе. Я не хочу перекодировать механизм кэширования, но полагаюсь на реализацию Tomcat. Поэтому я хотел бы «переслать» запрос во внутренней цепочке обработчиков. Я пробовал return new Viewable(sb.toString());, но для просмотра это не картинка. Какой тип возврата я могу использовать?

Я мог бы оставить конкретную картинку на другом URL и отправить 307 (временное перенаправление). Всегда посылать это как ответ кажется странным для меня.

Возможно, решение, имеющее обновление по методу "GET", является ошибочным по своему замыслу. Возможно, метод «PUT» / «POST» должен обновить картинку, а GET всегда должен обрабатываться tomcat.

Почему вопрос озаглавлен «Как мне эмулировать форвард на 404 в майке?». Особенность com.sun.jersey.config.feature.FilterForwardOn404 делает то же самое: если ресурс не может быть обработан джерси, он пересылается через цепочку фильтров / сервлетов. Я думаю, что моя проблема похожа на это.

Смежный вопрос: Как вернуть изображение PNG из метода сервиса REST Джерси в браузер

1 Ответ

0 голосов
/ 02 апреля 2012

ИМХО, лучший способ справиться с этим - не пытаться перенаправить клиента, а получить сам запрашиваемый элемент. Вы пытаетесь заставить Джерси вести себя так, как ему не следует. Когда кто-то вызывает службу отдыха для чего-то похожего на изображение (на самом деле не самое лучшее использование для службы отдыха), вы должны ответить изображением. Так что иди, возьми его из любого кеша и верни его. Не просите клиента пойти за ним.

Вы можете делегировать выборку этого изображения вашей службе кэширования ...

Response getImage(...) {
   if(image.isNotCached()) {
       ... get image locally
      cacheService.set(image,key);
      return Response.ok().entity(<image>);
   } else {
      return Response.ok().entity(cacheServce.get(key);
   }
}

или что-то в этом роде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...