关闭类路径扫描的Vaadin 14应用Grid多表头行显示异常问题
我在Vaadin 14应用中使用
appendHeaderRow()或prependHeaderRow()为Grid添加额外表头行时,Grid始终仅显示一行表头。我大致知晓问题成因,但未找到可行解决方案。
我的项目关闭了类路径扫描功能,手动实例化并调用Vaadin使用的初始化器。我有一个实现了ServletContextListener的类负责调用初始化器,和通用无类路径扫描示例的VaadinInitializer类逻辑一致。
我认为要让表头行正常显示,需要将ColumnGroup.class传入DevModeInitializer,它对应添加多表头后Grid HTML结构中的<vaadin-grid-column-group>元素。此前我已经通过该方式完成了Grid、GridSelectionColumn等大量Vaadin类的适配,保证组件正常显示。但问题在于ColumnGroup类不是公共类,我无法导入它并传入初始化器。
请问是否有可行的替代方案?还是说在我当前的项目配置下无法实现Grid多表头行的正常显示?
解决方案
有两种可直接落地的方案,无需调整你当前关闭类路径扫描的基础配置:
- 方案1:反射加载非公共的ColumnGroup类
不需要显式导入ColumnGroup类,直接通过全限定类名反射获取Class对象,加入你传给DevModeInitializer的类集合即可,示例代码如下:
// 在你的VaadinInitializer初始化逻辑中添加以下代码 Class<?> columnGroupClass = Class.forName("com.vaadin.flow.component.grid.ColumnGroup"); // 将columnGroupClass加入原有的初始化类集合中,和之前传入Grid等类的处理逻辑一致
只要ColumnGroup在你的项目类路径下,就能正常加载,效果和传入公共组件类完全相同。
- 方案2:手动声明前端组件依赖
如果不想使用反射,你可以在任意已经被DevModeInitializer纳入适配的类(比如你项目中使用Grid的业务类、配置类)上,添加对应前端组件的导入注解即可:- 如果你使用Vaadin 14默认的npm模式,添加注解:
@JsModule("@vaadin/vaadin-grid/src/vaadin-grid-column-group.js") - 如果你使用Vaadin 14的Bower兼容模式,添加注解:
@HtmlImport("bower_components/vaadin-grid/src/vaadin-grid-column-group.html")
添加后构建打包阶段会自动引入vaadin-grid-column-group的前端资源,多表头就能正常渲染。
- 如果你使用Vaadin 14默认的npm模式,添加注解:
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

