o:graphicImage 在数据库中删除或更新实际图像时不会更改

o:graphicImage does not change when actual image is deleted or updated in database

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

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

我的 属性 看起来像:

@Lob
private byte[] image;

我的dao/service是这样的:

@Name
@ApplicationScoped
public class Images {

    @Inject
    private UserDAO userDAO;

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

具体问题:

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

我的假设:未找到图像且未显示图像(或典型的 'image is not found'-图像。)。

但是:显示的是旧图像。即使在重新启动服务器并清理干净之后。没有改变。我试图将另一张图片上传到数据库 - 结果相同。

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

图像正在被客户端缓存。 <o:graphicImage>在这方面非常有效。

您基本上需要清理浏览器缓存,或在浏览器中执行强制重新加载,或打开隐身模式 window。

避免这种情况的一种方法是在 lastModified 属性中包含图像的“最后修改”时间戳,它可以是 java.util.Date,也可以是代表时代的 java.lang.Long时间。最好将此 属性 添加到您的实体中。

<o:graphicImage ... lastModified="#{image.lastModified}" />

它最终将作为生成图像 URL 中的 v= 请求参数结束,特此在其更改时欺骗浏览器缓存。

另一种方法是仅在方法参数中更改图像的 ID。如果您仍然在 HTML 响应中提供旧图像 ID,而数据库中不再存在此 ID,从这个角度来看也有点奇怪。

另请参阅: