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

