拒绝尚未发布的文件的已发布文件请求。尝试了所有选项,但没有工作



我正在尝试实现一个示例应用程序,其中所有的javascript(JS)&CSS文件使用许多png文件。

我参考了很多文章,但它们对我没有帮助

对于所有的png文件,我得到以下错误,

样本错误部分,

Jan 29, 2019 3:25:22 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/chartIcon.png
Jan 29, 2019 3:25:22 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/sunburst.png
Jan 29, 2019 3:25:22 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/treemap.png
Jan 29, 2019 3:25:40 PM com.vaadin.server.communication.PublishedFileHandler handleRequest
WARNING: Rejecting published file request for file that has not been published: css/images/sprite.png

以下是我的文件夹结构,

de.qsoft.manatee.web.vaadin.myapp
de.qsoft.manatee.web.vaadin.myapp.css  --> Contains all CSS files
de.qsoft.manatee.web.vaadin.myapp.fileMenu --> Contains all CSS files
de.qsoft.manatee.web.vaadin.myapp.widgets --> Contains all CSS files
de.qsoft.manatee.web.vaadin.myapp.scripts  --> contains all js files
de.qsoft.manatee.web.vaadin.myapp.widgets  --> contains all js files
de.qsoft.manatee.web.vaadin.myapp.colorpicker  --> contains all js files
SpreadJSWidget.Java
@JavaScript({
"scripts/jquery-1.11.1.min.js",
"scripts/jquery-ui-1.10.3.custom.min.js",
"spreadjs_connector.js",
"colorpicker/colorPicker.js",
"fileMenu/fileMenu.js",
"scripts/actionmanager.js",
"scripts/app.js",
"scripts/bootstrap.min.js",
"scripts/FileSaver.min.js",
"scripts/gc.spread.excelio.12.0.5.min.js",
"scripts/gc.spread.sheets.all.12.0.5.min.js",
"scripts/gc.spread.sheets.barcode.12.0.5.min.js",
"scripts/gc.spread.sheets.charts.12.0.5.min.js",
"scripts/gc.spread.sheets.pdf.12.0.5.min.js",
"scripts/gc.spread.sheets.print.12.0.5.min.js",
"scripts/gc.spread.sheets.shapes.12.0.5.min.js",
"scripts/license.js",
"scripts/resources.js",
"scripts/ribbon-data.js",
"scripts/ribbon.js",
"scripts/sample.js",
"scripts/spreadActions.js",
"scripts/util.js",
"widgets/addChartElement/chartAddChartElement.js",
"widgets/chartColorPicker/chart-colorPicker.js",
"widgets/chartLayoutPicker/chartLayoutPicker.js",
"widgets/richText/richTextEditor.js"
})

@StyleSheet({
"colorpicker/colorPicker.css",
"css/font-awesome/css/font-awesome.min.css",
"css/bootstrap-theme.min.css",
"css/bootstrap.min.css",
"css/borderpicker.css",
"css/colorpicker.css",
"css/excel2013.css",
"css/gc.spread.sheets.12.0.5.css",
"css/gc.spread.sheets.excel2013white.12.0.5.css",
"css/insp-slicer-format.css",
"css/insp-table-format.css",
"css/inspector.css",
"css/sample.css",
"css/shapes.css",
"fileMenu/fileMenu.css",
"widgets/addChartElement/chartAddChartElement.css",
"widgets/chartColorPicker/chart-colorPicker.css",
"widgets/chartLayoutPicker/chartLayoutPicker.css",
"widgets/richText/richTextWithRichEditor.css",
})

public class SpreadJSWidget extends AbstractJavaScriptExtension
{
/**
* 
*/
private static final long serialVersionUID = -804316208810859887L;
public interface ValueChangeListener extends Serializable {
void valueChange();
}
ArrayList<ValueChangeListener> listeners = new ArrayList<ValueChangeListener>();
public void addValueChangeListener(ValueChangeListener listener) {
listeners.add(listener);
}

/**
* 
*/
public SpreadJSWidget() {
// TODO hari: Auto-generated constructor stub
}
/*'***************************************************************************************
*   Static/Inner class members                                         
******************************************************************************************/
/*'***************************************************************************************
*   Class members                                         
******************************************************************************************/
public void setValue(String value) {
getState().value = value;
}

@Override 
protected void extend(AbstractClientConnector target) {
// TODO hari: Not Yet Implemented
super.extend(target);
}

public String getValue() {
return getState().value;
}
@Override protected SpreadJSWidgetState getState() {
return (SpreadJSWidgetState) super.getState();
}
}

我一步一步地尝试了以下操作,但我无法得到预期的结果,

  1. 我将所有png文件保存在目录"de.qsoft.manate.web.vaadin.myapp.css"下,作为"de.qsoft.manatE.web.vaadiin.myapp.css.images">

  2. 在VAADIN文件夹下,我将所有png文件复制为"VAADIN/css/images/">

  3. 在VAADIN文件夹下,如"VAADIN/themes/mytheme/img/css/images">

  4. 在VAADIN文件夹下,如"VAADIN/themes/mytheme/layouts/css/images">

    @主题("mytheme")公共类MyUI扩展UI{

    @Override
    protected void init(VaadinRequest vaadinRequest) {
    SpreadWidget widget = new SpreadWidget();
    setContent(widget);
    
    }
    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
    

    }

请告诉我应该把所有png文件放在哪里。每个css都将图像文件引用为

http://localhost:8080/spreadjs/APP/PUBLISHED/css/images/AllShapes.png

这里发生的事情是由安全功能引起的。由于在这种情况下,文件是直接从类路径提供的,Vaadin采取了一些预防措施,以防止意外地从类路径发布其他内容,例如可能包含敏感密码的DatabaseConnection.java

因此,只有使用@StyleSheet@JavaScript@HtmlImport注释显式发布的文件才可用。由于例如css/images/AllShapes.png没有相应的注释,因此服务器忽略这些请求。

我知道在这种情况下有几个潜在的解决方案,但都不是很优雅:

  1. 将图像放在例如VAADIN/css/images中,并更新CSS以使用适当数量的../段来抵消URL的/APP/PUBLISHED/部分。因此,CSS中的URL将类似于../../VAADIN/css/images.AllShapes.png
  2. 将CSS与图像一起放在VAADIN/中。这样,您就不需要更改引用图像的URL,而是需要手动加载CSS,而不是依赖于方便的@StyleSheet注释。在这种情况下,我建议使用类似ui.getPage().getStyles().add(new ThemeResource("../../css/name.css"));的东西。../../部分是取消将自动用于主题资源的themes/mytheme/。您可以在例如attach()方法中执行此操作(只需记住也要调用super.attach())。最好还应该添加一些逻辑,这些逻辑只在以前没有为同一UI实例添加依赖项的情况下才添加
  3. 使用内部LegacyCommunicationManager.registerDependency方法也可以注册您的映像,使其可以直接从类路径获得。您可以使用vaadinSession.getCommunicationManager()找到LegacyCommunicationManager的实例

作为一个无关的注意事项,我建议将不同的脚本和CSS文件组合成每种类型的单个文件。原因是通过HTTP加载大量小文件会导致一些性能开销,可以通过将文件捆绑在一起来避免这些开销。

最新更新