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

如何在Thymeleaf页面显示Java Sale对象的ReturnCode?解决空指针问题

解决Cielo SDK Sale对象传递到Thymeleaf为空导致的EL1011E错误

以下是逐步排查和解决的方案:

1. 确认控制器正确将Sale对象注入Model

首先检查控制器方法中是否确实将Sale对象添加到Spring MVC的Model中,同时验证createSale接口返回的对象不为空:

@PostMapping("/submit-payment")
public String handlePaymentSubmission(Model model) {
    // 构建Cielo支付请求参数
    PaymentRequest request = buildPaymentRequest();
    Sale sale = cieloEcommerceClient.createSale(request);
    
    // 打印日志确认Sale对象及ReturnCode是否存在
    System.out.println("Sale对象是否为空:" + (sale == null));
    if (sale != null) {
        System.out.println("ReturnCode:" + sale.getReturnCode());
    }
    
    // 确保将Sale对象添加到Model,即使为空也建议传入空对象而非null
    model.addAttribute("sale", sale != null ? sale : new Sale());
    return "payment-confirmation";
}

注意:如果createSale可能返回null,不要直接将null传入Model,建议创建空的Sale对象,避免视图层空指针。

2. 排查Cielo SDK调用是否异常

检查createSale调用过程中是否发生异常被静默处理,导致Sale对象未正确赋值:

try {
    sale = cieloEcommerceClient.createSale(request);
} catch (CieloApiException | IOException e) {
    // 打印异常日志,定位SDK调用失败原因
    e.printStackTrace();
    // 创建包含错误信息的Sale对象,传递到视图
    Sale errorSale = new Sale();
    errorSale.setReturnCode("SDK_CALL_FAILED");
    model.addAttribute("sale", errorSale);
}

常见的SDK调用失败原因包括:商户密钥/ID错误、请求参数格式不符合要求、网络连接问题。

3. Thymeleaf视图添加空值保护

即使控制器传递了null,通过Thymeleaf的安全导航操作符?.避免空指针:

<div class="payment-result">
    <h3>支付结果</h3>
    <p>返回码:<span th:text="${sale?.returnCode}">无返回码</span></p>
</div>

也可以通过条件判断显示不同内容:

<div th:if="${sale != null}" class="payment-result">
    <p>返回码:<span th:text="${sale.returnCode}"></span></p>
</div>
<div th:unless="${sale != null}" class="error-message">
    <p>支付请求处理失败,请稍后重试</p>
</div>

4. 处理重定向场景下的参数传递

如果控制器使用重定向跳转视图,普通的model.addAttribute会丢失参数,需要使用RedirectAttributes的addFlashAttribute:

@PostMapping("/submit-payment")
public String handlePaymentSubmission(RedirectAttributes redirectAttributes) {
    Sale sale = cieloEcommerceClient.createSale(buildPaymentRequest());
    // Flash属性会保留到下一次请求
    redirectAttributes.addFlashAttribute("sale", sale != null ? sale : new Sale());
    return "redirect:/payment-confirmation";
}

Thymeleaf视图中可以直接通过${sale}获取Flash属性值。

5. 排查Spring MVC配置或拦截器干扰

检查是否存在自定义拦截器、过滤器修改了Model对象,导致sale属性被清空;同时确认视图名称与实际Thymeleaf模板文件名完全一致(区分大小写)。

内容的提问来源于stack exchange,提问作者Rafael Sampaio Moura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:19:59