Vaadin 23升级后@Viewport注解处理异常致启动失败的解决方法咨询
问题原因
Vaadin 23 调整了AppShell配置的加载规则,强制要求@Viewport、@PWA、@Meta等AppShell相关注解只能放在实现了AppShellConfigurator的自定义类上,启动时默认会扫描所有类(包括从父类继承得到的)的相关注解,一旦在非AppShellConfigurator类上检测到这类注解就会抛出启动错误。你遇到的问题就是业务类继承的第三方抽象类自带@Viewport注解,被默认扫描逻辑识别导致的。
解决方案
方案1:配置关闭注解继承扫描(推荐,零代码改动)
Vaadin 23.1 版本已提供对应配置开关,关闭后校验逻辑仅检查类上直接声明的AppShell注解,不会向上遍历父类,第三方父类携带的注解不会被识别,同时你直接写在AppShellConfigurator实现类上的配置可以正常加载,完全不受影响。
根据项目类型在对应配置文件添加一行配置即可:
- Spring Boot 集成项目:在
src/main/resources/application.properties中添加
vaadin.app-shell-check-annotations-inherited=false
- 非Spring的原生Vaadin项目:在
src/main/resources/vaadin.properties中添加上述配置。
方案2:组合代替继承(配置不生效时备选)
如果遇到小版本兼容问题导致上述配置无效,不需要弃用第三方库,将业务类和第三方抽象类的继承关系改为组合调用即可:
- 删除业务类对第三方抽象类的
extends声明 - 在业务类内部实例化第三方类作为私有成员变量
- 原业务类中所有调用父类方法的逻辑,全部改为调用内部成员变量的对应方法
- 业务类需要实现的Vaadin路由接口、生命周期接口直接自行声明实现
这种方式从根源上避免了注解通过继承传递,不需要修改第三方库源码,改造成本仅和业务类中调用父类方法的数量相关。
避坑提示
不要通过修改第三方Jar包字节码、自定义类加载器过滤注解等重操作绕过校验,上述两个方案无额外兼容隐患,完全覆盖当前场景。
内容的提问来源于stack exchange,提问作者ulim
相关产品推荐
相关产品推荐

