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
相关产品推荐
相关产品推荐

