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

Vaadin Spring Boot注册成功后跳转登录页异常问题

问题分析与解决

问题原因

你的代码中private UI ui;变量未正确初始化,首次点击注册按钮时ui为null,导致ui.access(...)无法执行后续跳转逻辑;第二次点击时UI实例已完成绑定,跳转逻辑才生效。

另外,sendRegistrationRequest方法的参数定义与调用不一致:调用时传入了3个参数,但方法仅接收2个,虽不直接影响跳转,建议同步修正。

解决方案

1. 正确初始化UI实例

在视图类中重写onAttach方法,获取当前UI实例并赋值:

@Override
protected void onAttach(AttachEvent attachEvent) {
    super.onAttach(attachEvent);
    this.ui = attachEvent.getUI();
}

2. 优化异步回调的UI操作

无需维护ui成员变量,在发起异步请求前捕获当前UI实例,避免异步线程中UI.getCurrent()返回null:

public void sendRegistrationRequest(String email, String password) {
    JsonObject payload = Json.createObject();
    payload.put("email", email);
    payload.put("password", password);

    // 提前捕获当前UI
    UI currentUI = UI.getCurrent();
    if (currentUI == null) {
        onError("无法获取当前UI实例");
        return;
    }

    try {
        HttpClient httpClient = HttpClient.newHttpClient();
        String registrationEndpoint = "/users/registration";
        String apiUrl = apiBaseUrl + registrationEndpoint;
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(apiUrl))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(payload.toJson()))
                .build();

        httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(response -> {
                    log.info(response.statusCode() + " " + response.body());
                    currentUI.access(() -> handleResponse(response.statusCode()));
                    return null;
                })
                .exceptionally(e -> {
                    currentUI.access(() -> onError("Netzwerkfehler: " + e.getMessage()));
                    return null;
                });
    } catch (Exception e) {
        onError("Fehler bei der Registrierung: " + e.getMessage());
    }
}

3. 修正参数不一致问题

如果需要校验确认密码,同步修改方法定义:

public void sendRegistrationRequest(String email, String password, String confirmPassword) {
    // 新增密码匹配校验
    if (!password.equals(confirmPassword)) {
        Notification.show("密码与确认密码不匹配");
        return;
    }
    // 原有逻辑...
}

关键说明

Vaadin中所有UI操作必须在UI线程执行,ui.access(Runnable)用于将操作提交到UI线程。若ui实例为null,该方法不会执行任何逻辑,这是首次点击不跳转的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:17:47