我有一个拒绝已发布的文件请求,该文件尚未发布,用于自定义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>
答案 0 :(得分:2)
此问题的解决方案是,将静态图像资源添加到/ VAADIN /的子文件夹,因为此文件夹中包含的所有资源始终可以直接以静态方式访问,甚至可以移动样式表和所有使用的图像这是一个Vaadin主题(有关如何执行此操作的详细信息,请参阅Vaadin书中的Themes chapter)。
另一种选择(虽然相当混乱)也可以通过将它们包含在@JavaScript注释中来使所需的图像文件成为组件的依赖关系,这将导致它们与组件及其样式表一起正确发布,但在浏览页面时也会在浏览器中产生错误。
关于这个主题,还有一个(现已关闭)ticket和forum 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);
}
}