如何创建 OmniFaces GraphicImage 方法的缩略图链接

2023-11-29

我想知道是否以及如何可以显示<o:graphicImage>作为缩略图内<p:lightbox>。更准确地说,我想实现这样的目标:

<p:dataTable id="articles" var="article"
  value="#{articleMB.articles}" selectionMode="single"
  rowKey="#{articles.id}"
  selection="#{articleMB.selectedArticle}">
  <p:column>
    <p:lightBox styleClass="imagebox" id="lighbox">  
      <h:outputLink value="#{imageBean.getFirstImage(article, true)}">  
        <o:graphicImage value="#{imageBean.getFirstImage(article, true)}" dataURI="true" height="80" />  
      </h:outputLink>
     </p:lightBox>
   </p:column>
</p:dataTable>

这显然不起作用,因为没有正确的 URL 传递到灯箱。imageBean.getFirstImage(Article article, boolean thumbnail)返回一个byte[]图像的,因为我想要访问的图像存储在外部源上。


编辑:所以我已经按照 BalusC 提到的那样做了,这似乎是正确的方法。但现在我遇到以下异常:

Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@2eae887c 
    at sun.reflect.GeneratedMethodAccessor307.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.omnifaces.resourcehandler.GraphicResource.getInputStream(GraphicResource.java:259) 
    at com.sun.faces.application.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:335) 
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:153) 
    at org.primefaces.application.resource.PrimeResourceHandler.handleResourceRequest(PrimeResourceHandler.java:87) 
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:153) 
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:153) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:655) 
    ... 32 more

这是实际返回图像的方法。它在其他所有环境中都运行良好:

public byte[] getFirstImage(final Article article, boolean thumbnail)
{
    try
    {
        File dir = new File(getImageFolder(article.getImageFolder(), thumbnail));
        File[] files = dir.listFiles(new FilenameFilter()
        {
            @Override
            public boolean accept(File dir, String name)
            {
                return name.startsWith(String.valueOf(article.getArticleId()));
            }
        });
        Arrays.sort(files);
        return Files.readAllBytes(files[0].toPath());
    }
    catch (Exception e)
    {
        return new byte[1];
    }
}

Edit 2:正如评论中提到的,我面临着另一种奇怪的行为。它在我的本地计算机上运行得很好,但在服务器上它抛出以下异常:

Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.omnifaces.resourcehandler.GraphicResource.getInputStream(GraphicResource.java:259)
    at com.sun.faces.application.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:335)
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:153)
    at org.primefaces.application.resource.PrimeResourceHandler.handleResourceRequest(PrimeResourceHandler.java:87)
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:153)
    at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:153)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:655)
    ... 32 more

正是出于这个原因,OmniFaces 2.5 引入了#{of:graphicImageURL()}EL功能。仅当您的ImageBean注释为@GraphicImageBean.

import org.omnifaces.cdi.GraphicImageBean;

@GraphicImageBean
public class ImageBean {

    // ...

}

<h:outputLink value="#{of:graphicImageURL('imageBean.getFirstImage(article, false)')}">  
    <o:graphicImage value="#{imageBean.getFirstImage(article, true)}" dataURI="true" height="80" />  
</h:outputLink>

也可以看看the @GraphicImageBean展示.


Update:要明确的是,您需要一个非标准类型的转换器,例如Article。为什么需要这样的转换器以及如何创建它详见“null Converter”的转换错误设置值。如果您创建一个@FacesConverter(forClass=Article.class),然后是 OmniFacesGraphicImage会自动拾取它。

然而,在您的特定情况下,立即将标识符传递给图像流处理方法会更有效,这可以节省额外的转换步骤。前提是你的Article对象有一个id属性,方法如下:

<h:outputLink value="#{of:graphicImageURL('imageBean.getFirstImage(article.id, false)')}">  
    <o:graphicImage value="#{imageBean.getFirstImage(article.id, true)}" dataURI="true" height="80" />  
</h:outputLink>

public byte[] getFirstImage(Long articleId, boolean thumbnail) {
    // ...
}

也就是说,JSF 已经具有标准类型的内置转换器,例如Long and boolean.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 OmniFaces GraphicImage 方法的缩略图链接 的相关文章

随机推荐

  • 记录 Jenkins 中的更改

    在这里继续我的问题 Jenkins 在外部可执行文件上的构建通过或失败 我的构建过程现在使用 MS Build 从源代码构建 并作为构建过程的一部分执行自定义程序 我在程序中写入控制台的任何内容都将记录在控制台输出中 但是 我还想在用户界面
  • C 将 argv[] 中的字符串分配给 char 数组

    我有以下代码 它从命令行读取文件名并打开该文件 include
  • setcookie,无法修改标头信息 - 标头已发送[重复]

    这个问题在这里已经有答案了 我是PHP新手 刚刚练习PHP setcookie 失败了 http localhost 测试 索引 php
  • 如何将 DNS 条目添加到 Windows 容器的主机文件中?

    我的主机的 IIS 中有一个网站 可以通过以下方式访问http mysite local地址 我还有一个在此主机上运行的 Windows 容器 我正在尝试使用 curl http mysite local 从我的 Windows 容器连接到
  • 使用 NDEF Android 应用程序记录 (AAR) 获取 NFC 标签

    我正在开发 NFC 应用程序 为了启动我的应用程序 我使用了 NDEF 标签 其中包含 AAR NDEF 记录 这很好用 但现在我想直接用应用程序读取标签内容 我怎样才能做到这一点 当我从手机上取下标签并再次触摸它时 它已经可以工作了 但我
  • 映射超类的命名查询

    我试图在映射的超类上声明 NamedQuery 但收到此错误 org hibernate hql ast QuerySyntaxException VoipCall 未映射 select v from VoipCall v where v
  • TinkerPop:添加顶点图 API 与遍历 API

    背景 在其中之一SO posts推荐使用 Traversal API 而非 Graph API 来进行变异 所以我尝试了一些测试 发现 Graph API 似乎更快 我完全相信这个建议 但我试图了解它如何更好 我确实尝试过谷歌搜索 但没有找
  • cout 是同步/线程安全的吗?

    一般来说 我假设流不同步 由用户来执行适当的锁定 但是 做类似的事情cout在标准库中得到特殊待遇 也就是说 如果多个线程正在写入cout他们会腐败吗cout目的 我知道即使同步 您仍然会得到随机交错的输出 但交错是否有保证 也就是说 使用
  • 在 Python 中从 CSV 文件访问列数据

    我有一个包含 A B C D 列和 N 行的 CSV 文件 问题是这些列中的数据长度不同 即有些是 4 5 有些是 4 52 我的问题分为两部分 我如何从 csv 文件访问这些列 我使用此代码来打印 csv 文件的内容并将它们读入数组 im
  • React 中的 Markdown 与 Typescript

    有没有办法使用 Typescript 解析 React 中的 Markdown 我正在尝试做这样的事情 import as ReactMarkdown from react markdown OR import ReactMarkdown
  • 数据和同步 - 手动同步邮件。日历和联系人

    我正在尝试编写一个应用程序 只需单击一下即可同步我的邮件和日历 在浏览这个论坛后 我发现了一些很好的提示 并编写了一个简短的测试应用程序 该应用程序使用我的第一个谷歌帐户并开始同步 到目前为止 代码正在运行 但目前仅同步了联系人 Accou
  • 从Python列表继承后重写append方法

    我想创建一个只能接受某些类型的列表 因此 我尝试从Python中的列表继承 并重写append 方法 如下所示 class TypedList list def init self type self type type def appen
  • 如何在 JavaScript 中查找文本框中的单词

    我正在制作一个类似于 Google Now 应用程序的网站 我想知道如何让 JavaScript 在文本框中查找某个单词 例如 如果有人在文本框中输入 显示天气 JavaScript 世界会看到关键字 天气 它会向我显示天气 这是我的代码
  • 错误:SQLite 从文件导入数据

    我正在尝试从以逗号分隔的文件加载数据 例子 A positive 9619 A095CDB461A1FEED positive 1 当我尝试在 sqlite3 数据库中加载此文件时 出现错误 sqlite gt mode csv featu
  • Google 地图屏幕截图不适用于使用 html2canvas 的标记和标记集群

    我正在使用 Flask 做 python 项目 其中我使用 google 地图 api 来显示项目中的地图 我实施html2canvas脚本成功捕获地图 但我在地图上也有标记 但它没有捕获 所以我尝试使用html2canvasPython代
  • 向下滚动时替换 div 中的图像

    想要在向下滚动和向上滚动时用图像 resized png 替换 logo 中的图像应恢复正常 尝试使用代码
  • 使用 viewpager 滑动图像(不是布局)

    我的代码的作用 这是我的代码 用于在 xml 布局 名为 left xml right xml 和 center xml 之间滑动的 viewpager 我想要它做什么 我想在图像之间滑动 存储在可绘制文件夹中 当我用 R drawable
  • C - 链接列表 - 插入元素未更新 - 仅添加最后一个输入元素

    PREFACE 目标是提示用户输入 将每个元素 输入行 添加到链接列表中 我一直在玩一些示例代码学习C org 它显示了一个链表示例 我修改了代码 使其采用 字符串 而不是整数 My insert函数如下 void push node t
  • doParallel 包中的选项“cores”在 Windows 上无用?

    在 Linux 计算机上 执行以下操作并行的小插图 I use doParallel registerDoParallel 然后我用options cores N where N是我想要使用的核心数量foreach 我可以验证foreach
  • 如何创建 OmniFaces GraphicImage 方法的缩略图链接

    我想知道是否以及如何可以显示