o:graphicImage не изменяется при удалении или обновлении фактического изображения в базе данных
Я пытаюсь отобразить, который хранится в базе данных. у меня есть <o:graphicImage value="#{image.getById(1)}" />
,
Примечание. Идентификатор (1) предназначен только для тестирования.
Моя собственность выглядит так:
@Lob
private byte[] image;
и мой дао / сервис это:
@Name
@ApplicationScoped
public class Images {
@Inject
private UserDAO userDAO;
public byte[] getById(int id) {
return userDAO.getUserByID(id).getImage();
}
К конкретной проблеме:
Я только что реализовал это, и изображение отображается правильно. Я установил изображение вручную NULL
в базе данных.
Мое предположение: изображение не найдено и изображение не отображается (или типичное изображение "изображение не найдено").
Но: отображается старое изображение. Даже после перезагрузки сервера и чистой. Ничего не изменилось. Я пытался загрузить другое изображение в базу данных - тот же результат.
В чем здесь проблема? Где моя вина? Как я могу это исправить?
1 ответ
Изображение кэшируется клиентом. <o:graphicImage>
очень эффективен в этом.
В основном вам нужно очистить кеш браузера, или выполнить принудительную перезагрузку в браузере, или открыть окно инкогнито.
Один из способов избежать этого состоит в том, чтобы включить метку времени последнего изменения изображения в lastModified
атрибут, который может быть java.util.Date
или java.lang.Long
представляющий время эпохи. Лучше всего добавить это свойство к вашей сущности.
<o:graphicImage ... lastModified="#{image.lastModified}" />
В конечном итоге это v=
параметр запроса в сгенерированном URL-адресе изображения, таким образом обманывая кеш браузера при его изменении.
Другой способ - просто изменить идентификатор изображения в аргументе метода. С этой точки зрения также немного странно, если вы продолжаете предоставлять старый идентификатор изображения в ответе HTML, пока этот идентификатор больше не существует в базе данных.
Смотрите также:
<o:graphicImage>
витрина - Кеширование