我收到一个拒绝已发布文件的请求,该文件尚未针对css中引用了图像的自定义Vaadin 7组件发布:
StyleSheet("mycomponent.css")
@JavaScript( { "mycomponent1.js", "mycomponent2.js"})
public class MyComponent extends AbstractJavaScriptComponent {
//...
}
在mycomponent.css中,我有
background-image: url(mycomponent-bg.png);
瓦丁告诉我:
拒绝尚未发布的文件的发布文件请求:mycomponent-bg.png
查看Vaadin 7中的已发布文件处理程序,它说:
如果以前已通过调用 LegacyCommunicationManager#registerDependency(String, Class) 注册了该资源,则从类路径提供连接器资源。通过仅接受已显式注册的资源名称,可以防止从类路径发送任意文件。资源目前只能通过在连接器类上包含 {@link JavaScript} 或 {@link 样式表} 注释来注册。
在组件中进行手动注册不起作用:
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样式自定义组件的正确方法是什么?或者:如何将任意文件添加到依赖项?
这个问题的解决方案是,将静态图像资源添加到/VAADIN/的子文件夹中,因为这个文件夹中包含的所有资源总是可以以静态方式直接访问,或者甚至将样式表和它使用的所有图像移动到VAADIN主题中(有关如何做的详细信息,请参考Vaadin一书中的主题章节)。
另一种选择(尽管相当混乱)也是通过将所需的图像文件包含在@JavaScript注释中来使它们成为组件的依赖项,这将导致它们与您的组件及其样式表一起正确发布,但也会在查看页面时在浏览器中产生错误。
关于这个话题,也有一个(现已关闭)票和一个论坛线程,进一步详细说明了上述解决方案。
对于Vaadin 7...如果您的外部javascript或css加载图像,那么它应该放在/VAADIN/文件夹中。例如,如果我们在/VAADIN/js目录中有一个名为common.js的文件,您可以在java UI或AbstractJavaScriptComponent文件中使用路径@ JavaScript({ " VAADIN://js/common . js " })引用该文件,并将所有图像文件放在相对于该目录的位置...它会工作得很好....
@StyleSheet(..your css..)
public class YourAddonClass ... {
static {
VaadinSession.getCurrent().getCommunicationManager().
registerDependency("mycomponent-bg.png",
ClassInSamePackageAsmycomponent-bg.class);
}
}