带有@StyleSheet的Vaadin 7 CustomComponent引用图像URL - 拒绝尚未发布的文件的已发布文件请求

时间:2013-09-23 16:04:33

标签: java css vaadin

我有一个拒绝已发布的文件请求,该文件尚未发布,用于自定义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)注册了资源,则从类路径提供连接器资源。仅通过接受已明确注册的资源名称,可防止从类路径发送任意文件。目前只能通过在Connector类上包含{@link JavaScript}或{@link StyleSheet}注释来注册资源。

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

 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自定义组件的正确方法是什么?或者:如何向依赖项添加任意文件? < / p>

3 个答案:

答案 0 :(得分:2)

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

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

关于这个主题,还有一个(现已关闭)ticketforum thread,它们进一步详述了上述解决方案。

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

@StyleSheet(..your css..)
public class YourAddonClass ... {

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

}