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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:54:02