You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:48:19