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

Vaadin 23自定义PageNotFound路由返回200而非404问题排查

问题分析与修复方案

你的代码问题出在Vaadin的默认行为上:即使你在setErrorParameter返回了404状态码,Vaadin默认不会将该状态码写入HTTP响应(尤其是单页应用模式下,客户端路由跳转不会触发新的HTTP请求),导致浏览器收到的仍是200 OK。

修复方法

方法1:手动设置HTTP响应状态码

在setErrorParameter方法中,直接通过BeforeEnterEvent获取HttpServletResponse并设置状态码:

@ParentLayout(MainLayout.class)
@AnonymousAllowed
public class PageNotFound extends RouteNotFoundError {

    @Override
    public int setErrorParameter(BeforeEnterEvent event, ErrorParameter<NotFoundException> parameter) {
        VerticalLayout verticalLayout = new VerticalLayout();

        // 你的布局逻辑

        getElement().insertChild(0, verticalLayout.getElement());
        
        // 手动设置响应状态码
        if (event.getHttpServletResponse() != null) {
            event.getHttpServletResponse().setStatus(HttpServletResponse.SC_NOT_FOUND);
        }

        return HttpServletResponse.SC_NOT_FOUND;
    }

}

方法2:开启Vaadin的错误状态码发送功能

如果是Spring Boot项目,在application.properties中添加配置:

vaadin.servlet.send-error-codes=true

如果是传统Web项目,在web.xml的Vaadin Servlet配置里添加初始化参数:

<servlet>
    <servlet-name>VaadinServlet</servlet-name>
    <servlet-class>com.vaadin.flow.server.VaadinServlet</servlet-class>
    <init-param>
        <param-name>sendErrorCodes</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

说明

  • 方法1适用于需要在特定错误页面中自定义状态码的场景,确保服务器端直接返回的请求能正确设置状态码。
  • 方法2是全局配置,开启后Vaadin会自动将错误状态码发送到客户端,适用于所有错误页面的统一处理。

内容的提问来源于stack exchange,提问作者alexanoid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:15:51