wicket ExportToolbar在表更新时未刷新

wicket ExportToolbar在表更新时未刷新,wicket,Wicket,更新表内容时,我在更新ExportToolbar时遇到一些问题。第一次单击CSV导出链接时,它工作正常,但如果表被更新,并且再次单击CSV链接,则会导出与以前相同的表内容。我将尝试显示设置,以及数据是如何变化的。我希望有人以前见过这种行为,能给我指出正确的地方。我已经使用wicket 9年了,从来没有像现在这样被困在这里。提前感谢您的帮助 Wicket版本7.7.0,oops no 7.4.0(编辑1),抱歉 以下是表格的定义: //main report table init:

更新表内容时,我在更新ExportToolbar时遇到一些问题。第一次单击CSV导出链接时,它工作正常,但如果表被更新,并且再次单击CSV链接,则会导出与以前相同的表内容。我将尝试显示设置,以及数据是如何变化的。我希望有人以前见过这种行为,能给我指出正确的地方。我已经使用wicket 9年了,从来没有像现在这样被困在这里。提前感谢您的帮助

Wicket版本7.7.0,oops no 7.4.0(编辑1),抱歉

以下是表格的定义:

    //main report table init:
    List<ReportRow> records = db.getVisitCountsByGrouping( getSelectedMonth());
    mainProvider = new SearchProvider<>( records, "id" );
    mainProvider.setSummationRow(sumRow);
    this.mainColumns = new ArrayList<>();
    //...columns added....
    mainTable = new DefaultDataTable<ReportRow,String>("mainTable", mainColumns, mainProvider, 25);
    mainTable.setOutputMarkupId(true);
    rft = new ReportFooterToolbar(mainTable, sumRow, this);
    rft.setOutputMarkupId(true);
    mainTable.addBottomToolbar(rft);
    exportToolbar = new ExportToolbar(mainTable, new PropertyModel<String>(this,"mainTableExportFileName"));
    exportToolbar.addDataExporter(new CSVDataExporter());
    mainTable.addBottomToolbar(exportToolbar);
    add(mainTable);
(编辑3)我能够正确地更新文件名属性模型,并一致地使表导出链接正常工作,我仍然有一个问题,但我能够通过在更新时再次创建表并添加或替换(mainTable)而不是更新它,从而使此导出链接保持一致。这就是我能够让createExportLink()方法再次运行的原因,否则它只会在创建ExportToolbar时发生,而不会再次发生。现在,让我们假设ExportToolbar如下所示:

exportToolbar = new ExportToolbar(mainTable, new PropertyModel<String>(this,"mainTableExportFileName") ) {
        @Override
        protected Component createExportLink(String componentId, final IDataExporter dataExporter ) {
            logger.debug("createExportLink: "+ componentId +" exporter: "+ dataExporter.toString());
            Component component = super.createExportLink(componentId, dataExporter);
            return component;
        }
    };      
    exportToolbar.addDataExporter(new CSVDataExporter() );
exportToolbar=newexporttoolbar(mainTable,newpropertyModel(这是“mainTableExportFileName”)){
@凌驾
受保护的组件createExportLink(字符串componentId,最终IDataExporter数据导出器){
debug(“createExportLink:+componentId+”导出器:+dataExporter.toString());
Component=super.createExportLink(componentId,dataExporter);
返回组件;
}
};      
exportToolbar.addDataExporter(新的CSVDataExporter());

现在的诀窍似乎是,如果我在浏览器中删除历史记录并单击链接,那么一切都会正常工作,但如果我不这样做,则动态更改表并选择链接,会得到上次单击链接时的数据。所以看起来链接被缓存了。我正在渗透组件创建,如何更改组件以确保csv数据不被缓存?

得到了答案,进行了一些播放。诀窍是覆盖createexport链接,并使ResourceStreamResource在其上设置缓存超时。小门有时会痛

        exportToolbar = new ExportToolbar(mainTable, new PropertyModel<String>(this,"mainTableExportFileName"), new AbstractReadOnlyModel<String>() {
        @Override
        public String getObject() { return getMainTableExportFileName(); } 
    }) {
        @Override
        protected Component createExportLink(String componentId, final IDataExporter dataExporter ) {
            ResourceStreamResource resource = new ResourceStreamResource() {
                @Override
                protected IResourceStream getResourceStream() {
                    return new DataExportResourceStreamWriter(dataExporter, getTable());
                }
            };
            resource.setFileName(getFileNameModel().getObject() + "." + dataExporter.getFileNameExtension());
            resource.setCacheDuration(Duration.ONE_SECOND);
            return new ResourceLink<Void>(componentId, resource).setBody(dataExporter.getDataFormatNameModel());
        }
    };      
exportToolbar=newexporttoolbar(mainTable,newpropertyModel(这是“mainTableExportFileName”),new AbstractReadOnlyModel(){
@凌驾
公共字符串getObject(){return getMainTableExportFileName();}
}) {
@凌驾
受保护的组件createExportLink(字符串componentId,最终IDataExporter数据导出器){
ResourceStreamResource=新资源StreamResource(){
@凌驾
受保护的IResourceStream getResourceStream(){
返回新的DataExportResourceStreamWriter(dataExporter,getTable());
}
};
resource.setFileName(getFileNameModel().getObject()+““+dataExporter.getFileNameExtension());
resource.setCacheDuration(持续时间为1秒);
返回新的ResourceLink(componentId,resource).setBody(dataExporter.getDataFormatNameModel());
}
};      

我想这个bug一定是在SearchProvider类中。CSVDataExporter在其
#exportData()
方法中使用数据提供程序。你确定你用的是7.7.0吗?它还没有发布。你能发布你的SearchProvider类源代码(主要是方法迭代器()和更新(记录)吗。您似乎在某个地方有一个bug。文件名可能不会更新,因为我看不到您在哪里更新它。您使用的是属性模型,因此我希望您的页面上有一个属性
mainTableExportFileName
。我还希望您在
updateMainTable
方法中更改此属性,但您不知道。不确定我键入的原因7.7.0,我使用的是7.4.0,为了便于阅读,我应该压缩搜索提供程序。感谢您的耐心等待。
exportToolbar = new ExportToolbar(mainTable, new PropertyModel<String>(this,"mainTableExportFileName")) {
        @Override
        protected void onConfigure() {
            super.onConfigure();
            //setFileNameModel( new Model<String>( getMainTableExportFileName() ));
            if( getFileNameModel() != null )
                logger.debug("ExportToolbar file name model: "+ getFileNameModel().toString() +" file name: "+ getFileNameModel().getObject() );

            Iterator it = getTable().getDataProvider().iterator(0, getTable().getDataProvider().size());
            while( it.hasNext() ) {
                ReportRow r = (ReportRow) it.next();
                logger.debug("ExportToolbar data: "+ r.getCategory() +" "+ r.get1() +" "+ r.get2() + " "+ r.get3() );
            }
        }
    };
2017-03-06 12:28:52 DEBUG ReportPanel:244 - ExportToolbar file name model: Model:classname=[org.apache.wicket.model.PropertyModel]:nestedModel=[[ReportPanel [Component id = panel]]]:expression=[mainTableExportFileName] file name: 2017-January-AllVisits-ByReason
    2017-03-06 12:28:52 DEBUG ReportPanel:249 - ExportToolbar data: add/drop 0 38 63
    2017-03-06 12:28:52 DEBUG ReportPanel:249 - ExportToolbar data: withdraw 0 0 0
    2017-03-06 12:28:52 DEBUG ReportPanel:249 - ExportToolbar data: audit 0 0 3
    2017-03-06 12:28:52 DEBUG ReportPanel:249 - ExportToolbar data: advising 0 27 35
    2017-03-06 12:28:52 DEBUG ReportPanel:249 - ExportToolbar data: prospective 0 2 0
    2017-03-06 12:28:52 DEBUG ReportPanel:249 - ExportToolbar data: other 0 19 38
    2017-03-06 12:29:26 DEBUG ReportPanel:244 - ExportToolbar file name model: Model:classname=[org.apache.wicket.model.PropertyModel]:nestedModel=[[ReportPanel [Component id = panel]]]:expression=[mainTableExportFileName] file name: 2017-February-AllVisits-ByReason
    2017-03-06 12:29:26 DEBUG ReportPanel:249 - ExportToolbar data: add/drop 3 5 1
    2017-03-06 12:29:26 DEBUG ReportPanel:249 - ExportToolbar data: withdraw 0 1 0
    2017-03-06 12:29:26 DEBUG ReportPanel:249 - ExportToolbar data: audit 0 3 4
    2017-03-06 12:29:26 DEBUG ReportPanel:249 - ExportToolbar data: advising 8 6 6
    2017-03-06 12:29:26 DEBUG ReportPanel:249 - ExportToolbar data: prospective 3 1 2
    2017-03-06 12:29:26 DEBUG ReportPanel:249 - ExportToolbar data: other 8 8 7
exportToolbar = new ExportToolbar(mainTable, new PropertyModel<String>(this,"mainTableExportFileName") ) {
        @Override
        protected Component createExportLink(String componentId, final IDataExporter dataExporter ) {
            logger.debug("createExportLink: "+ componentId +" exporter: "+ dataExporter.toString());
            Component component = super.createExportLink(componentId, dataExporter);
            return component;
        }
    };      
    exportToolbar.addDataExporter(new CSVDataExporter() );
        exportToolbar = new ExportToolbar(mainTable, new PropertyModel<String>(this,"mainTableExportFileName"), new AbstractReadOnlyModel<String>() {
        @Override
        public String getObject() { return getMainTableExportFileName(); } 
    }) {
        @Override
        protected Component createExportLink(String componentId, final IDataExporter dataExporter ) {
            ResourceStreamResource resource = new ResourceStreamResource() {
                @Override
                protected IResourceStream getResourceStream() {
                    return new DataExportResourceStreamWriter(dataExporter, getTable());
                }
            };
            resource.setFileName(getFileNameModel().getObject() + "." + dataExporter.getFileNameExtension());
            resource.setCacheDuration(Duration.ONE_SECOND);
            return new ResourceLink<Void>(componentId, resource).setBody(dataExporter.getDataFormatNameModel());
        }
    };