【问题标题】:Apache Wicket does not load (or display) static imageApache Wicket 不加载(或显示)静态图像
【发布时间】:2013-10-16 16:14:43
【问题描述】:

我目前正在努力开发 wicket 并开发了一个小型演示应用程序。现在我想在该应用程序中显示一个静态图像(更具体地说,应该将此图像添加到面板中,然后将其添加到主页中)。

这是我目前所拥有的:

1) 应该保存图像的面板的 HTML 代码。没有特定的检票口代码,它应该只包含项目结构中存在的图像。

<html><body>
  <wicket:panel>
    Just some static text inside the image panel...<br/>
    <img src="test.jpg"></img>
  </wicket:panel>
</body></html>

面板名为 ImagePanel,所有三个文件(ImagePanel.java、ImagePanel.html、test.jpg)都位于同一个包中。

2) ImagePanel 的 Java 代码 - 相当短,因为没有什么可做的:

public class ImagePanel extends Panel {
    public ImagePanel(String id) {
        super(id);
    }
}

3) 主页的 HTML 代码:

<html><body>
  <div wicket:id="dynamicComponent"></div>
</body></html>

4) 以及首页的Java代码:

public HomePage() {
    add(new ImagePanel("dynamicComponent"));
}

请注意以下几点:实际上,HomePage.java 和 ImagePanel.java 位于不同的 OSGi 项目中。此处简化了 HomePage 的代码,实际上 ImagePanel 是通过服务定位并动态添加的。 到目前为止有效,我看到了静态文本。但是图像没有加载,我只是得到这个损坏的图像缩略图。

就像我说的,所有三个与 ImagePanel 相关的文件(.java、.html、图片)都位于同一个包中。我可以从主页项目访问面板本身,因为我可以看到静态文本。但我无法显示图像。

我使用的应用服务器是 Jetty,从包含主页的项目内部启动。

更新: 我已将问题缩小到以下几点: 只要我只在 ImagePanel.html 中显示静态文本,一切正常。只要我想添加图像(即使在下面建议的 wicket:link-tag 中),我最终会遇到以下异常:

[qtp401543768-20] WARN org.apache.wicket.core.util.lang.WicketObjects - Could not resolve class [plugin.ImagePanel]
java.lang.ClassNotFoundException: plugin.ImagePanel

因此,如果没有图像,服务器包能够从 gui 包中加载类并显示静态文本。有了这张图片,我最终得到了同一个类的 ClassNotFoundException。

在此处查找整个堆栈跟踪:stack trace

【问题讨论】:

    标签: wicket


    【解决方案1】:

    在你的模板中,放一个

     <wicket:link>
       <img src="test.jpg"></img>
     </wicket:link>
    

    Wicket 将重写 url 以使图像正常工作。

    如果您有要加载包资源的动态图像,请使用 PackageResourceReference。

    例如

    add(new Image("myImage", new PackageResourceReference(MyClass.class, "test.jpg"));
    

    【讨论】:

    • 我在图像的不同位置进行了尝试。无论我将图像放在项目结构中的哪个位置(与 ImagePanel 相同的包,imagepanel-project 的默认包,与 HomePage 相同的包,homepage-project 的默认包),我最终都会出现异常:@987654323 @,由检票口深处某处的 NullPointerException 引起。如果我尝试相同的方法,使用“/test.jpg”作为 src 而不是“test.jpg”,我最终会得到与以前相同的损坏图像缩略图。
    • 给出完整的堆栈跟踪,它可能无关紧要。
    • 没错,异常的真正原因隐藏在控制台日志中。我更新了上面的问题。
    • 我可以告诉你 ImagePanel 不是标准检票口的一部分。您可能在代码中的某处引用了 ImagePanel,这取决于您缺少的内容。
    • 你的整个命名空间是plugin.ImagePanel吗?
    【解决方案2】:

    感谢您的帮助,不过我自己设法解决了这个问题。这不是唯一的检票口问题,也是 OSGi-bundle-setup 的一些困难。

    正如我之前提到的,ImagePanel 与 HomePage 位于不同的 OSGi 包中。由于所有 Wicket 库都位于 HomePage 包中,因此出现了问题(如果两个包都使用自己的库,则会出现链接器错误)。因此,在 ImagePanel 中加载图像时使用了位于 HomePage-bundle 中的类,这些类现在无法访问该图像。

    我通过在 ImagePanel-bundle 中引入一个 OSGi-Service 解决了这个问题,它将所有使用的图像作为字节数组传递给 HomePage-bundle。 HomePage-bundle 现在可以访问所有资源并将它们注册为SharedResource,并使用 ImagePanel-bundle 再次提供的 id。

    注册后,通过SharedResourceReference访问ImagePanel-bundle中的图片就没有问题了。

    【讨论】:

      猜你喜欢
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      相关资源
      最近更新 更多