jsf - Ø :graphicImage does not change when actual image is deleted or updated in database

标签 jsf omnifaces graphicimage

我正在尝试显示存储在数据库中的 a。
我有一个 <o:graphicImage value="#{image.getById(1)}" /> .

注意:ID (1) 仅用于测试。

我的属性(property)看起来像:

@Lob
private byte[] image;

我的道/服务是这样的:
@Name
@ApplicationScoped
public class Images {

    @Inject
    private UserDAO userDAO;

    public byte[] getById(int id) {
        return userDAO.getUserByID(id).getImage();
    }

具体问题:

我刚刚实现了这个,图像显示正确。我手动将图像设置为 NULL在数据库中。

我的假设:未找到图像且未显示图像(或典型的“未找到图像”-图像。)。

但是:显示旧图像。即使在重新启动服务器和干净之后。没有改变。我尝试将其他图像上传到数据库 - 结果相同。

这里有什么问题?我的错在哪里?我怎样才能解决这个问题?

最佳答案

图像正在被客户端缓存。 <o:graphicImage>在这方面非常有效。
您基本上需要清理浏览器缓存,或在浏览器中执行强制重新加载,或打开隐身窗口。
避免这种情况的一种方法是在 lastModified 中包含图像的“最后修改”时间戳。属性,可以是 java.util.Date ,或 java.lang.Long代表纪元。最好是将此属性添加到您的实体。

<o:graphicImage ... lastModified="#{image.lastModified}" />
它最终会变成 v=生成的图像 URL 中的请求参数,从而在更改时欺骗浏览器缓存。
另一种方法是在方法参数中更改图像的 ID。如果您仍然继续在 HTML 响应中提供旧的图像 ID 而该 ID 不再存在于数据库中,那么从这个角度来看也有点奇怪。
也可以看看:
  • <o:graphicImage> showcase - Caching
  • 关于jsf - Ø :graphicImage does not change when actual image is deleted or updated in database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30131762/

    相关文章:

    jsf - ViewParam 与 @ManagedProperty(值 = "#{param.id}")

    maven - 如何通过Maven正确安装和配置JSF库?

    Java EE 目录结构

    ajax - 错误页面上的错误报告表

    javascript - <o :commandScript>: reference namespaced JS function name

    jsf - PrimeFaces 6.0 不在客户端缓存图片

    file-upload - 在JSF中显示上传的图像

    JSF 1.2 facelets 自定义组件

    java - SelectOneMenu 的 Primefaces 3.5 + OmniFaces 1.3 SelectItemsIndexConverter 问题

    jsf-2 - 在 JSF 中将 InputStream 显示为动态图像