2

对于自定义 Vaadin 7 组件,我收到了一个拒绝发布的文件请求,该文件在 css 中引用了一个图像:

StyleSheet("mycomponent.css")
@JavaScript( { "mycomponent1.js", "mycomponent2.js"})
public class MyComponent extends AbstractJavaScriptComponent { 
    //...
}

在 mycomponent.css 我有

background-image: url(mycomponent-bg.png);

Vaadin 告诉我:

拒绝未发布文件的已发布文件请求:mycomponent-bg.png

查看 Vaadin 7 中的PublishedFileHandler它说:

如果资源先前已通过调用 LegacyCommunicationManager#registerDependency(String, Class) 注册,则从类路径提供连接器资源。通过仅接受已显式注册的资源名称来防止从类路径发送任意文件。目前只能通过在连接器类上包含 {@link JavaScript} 或 {@link StyleSheet} 注释来注册资源。

在组件中进行手动注册不起作用:

 LegacyCommunicationManager lcm = new LegacyCommunicationManager(this.getSession());
 lcm.registerDependency("mycomponent-bg.png", this.getClass()); // 1.try
 lcm.registerDependency("mypath/mycomponent-bg.png", this.getClass()); // 2.try

问题:在 Vaadin 7 中使用带有图像的 css 样式自定义组件的正确方法是什么?或者:如何将任意文件添加到依赖项?

4

3 回答 3

2

解决此问题的方法是,将静态图像资源添加到 /VAADIN/ 的子文件夹,因为此文件夹中包含的所有资源始终可以直接以静态方式访问,甚至可以将样式表和它使用的所有图像移动到Vaadin 主题(有关如何执行此操作的详细信息,请参阅Vaadin 中的主题章节)。

另一种选择(虽然相当混乱)也是通过将所需的图像文件包含在 @JavaScript 注释中来使所需的图像文件成为组件的依赖项,这将导致它们与您的组件及其样式表一起正确发布,但会查看页面时也会在浏览器中产生错误。

关于这个主题,还有一张(现已关闭)的和一个论坛帖子,其中进一步详细说明了上述解决方案。

于 2013-09-24T14:52:11.210 回答
1

对于 Vaadin 7 ... 如果您的外部 javascript 或 css 加载图像,则应将其放置在 /VAADIN/ 文件夹中。例如,如果我们在 /VAADIN/js 目录中有一个名为 common.js 的文件,您可以在 java UI 或 AbstractJavaScriptComponent 文件中使用路径 @JavaScript({"vaadin://js/common.js"}) 和将所有图像文件相对于该目录...它会正常工作....

于 2014-09-11T03:10:32.467 回答
-1
@StyleSheet(..your css..)
public class YourAddonClass ... {

  static {
    VaadinSession.getCurrent().getCommunicationManager().
                registerDependency("mycomponent-bg.png",
    ClassInSamePackageAsmycomponent-bg.class);
   }

}
于 2015-07-31T20:11:49.100 回答