Vaadin 20升级到21后所有路由突然返回404问题咨询
问题根因定位及解决方案
你遇到的是Vaadin 20升级到21后的路由不识别问题,主要和Vaadin 21引入的几个核心变更有关,和你当前的路由定义、安全配置都可能相关,对应解决方案如下:
1. 路由注解使用逻辑调整
Vaadin 21对@Route/@RouteAlias的属性规则、路由类的生命周期管理做了优化,你当前的路由定义存在两处问题:
- 不需要给路由类添加
@Component和@UIScope注解:Vaadin会自动管理路由类的实例生命周期,Spring接管实例后会导致Vaadin路由扫描逻辑无法正常识别该类的路由配置 absolute = true属性仅在父布局存在路由前缀时需要使用:如果你的MainLayout没有配置@Route前缀,该属性会导致路由路径解析异常,建议先移除该属性测试
修改后的LoginView头配置参考:
@CssImport("./styles/page/login.css") @PageTitle("Login") @RouteAlias(value = "", layout = MainLayout.class) @Route(value = "login", layout = MainLayout.class) public class LoginView { // ... }
2. 安全配置规则变更
Vaadin 21对Spring Security的默认安全规则做了调整:
- 默认所有路由都需要身份验证,公开路由必须显式添加
@AnonymousAllowed注解标注,旧版本的permitAll()路径配置优先级低于Vaadin的注解校验 - 如果你使用了Spring Security,需要将安全配置类继承自
VaadinWebSecurity,替代旧版本的WebSecurityConfigurerAdapter适配新的集成逻辑
如果你的LoginView是公开访问页面,必须在类上添加@AnonymousAllowed注解。
3. 自定义404页面注册规则变更
Vaadin 21要求自定义错误页面必须添加@HttpErrorMapping注解绑定状态码才能被正常识别,你的CustomRouteNotFoundError缺少该注解,会导致路由匹配失败时的错误流向异常,调整后代码参考:
@ParentLayout(MainLayout.class) @PageTitle("Notfound") @HttpErrorMapping(HttpServletResponse.SC_NOT_FOUND) public class CustomRouteNotFoundError extends RouteNotFoundError implements BeforeEnterObserver { // ... }
4. 路由扫描范围校验
如果调整以上配置后仍存在问题,检查你的路由类是否在Spring Boot启动类的所在包及子包下:Vaadin 21默认仅扫描启动类包下的@Route注解类,若路由类在其他包,需要在启动类上添加@EnableVaadin("你的路由类所在包路径")注解指定扫描范围。
内容的提问来源于stack exchange,提问作者Jonas TM
相关产品推荐
相关产品推荐

