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

Thymeleaf模板中DTO间值传递失败:productId提交后为空

Thymeleaf表单提交后CartProductDTO的productId字段为空问题排查与解决

问题场景

我基于Java、Spring、Thymeleaf搭建个人项目,在商品购买页面通过ProductDetailDTO从数据库获取并展示商品尺寸、颜色、价格等数据,同时用CartProductDTO让用户自定义选择尺寸、数量。其中商品ID(productId)、价格等字段无需用户填写,尝试通过Thymeleaf将ProductDetailDTO的ID传递到CartProductDTO,但表单提交后Controller接收的CartProductDTO的productId字段为空。

尝试的代码

Thymeleaf输入框代码

<input type="number" 
       th:value="${productDetailDTO.getId()}" 
       th:field="*{productId}" 
       th:readonly="${true}" hidden />

Controller代码

@GetMapping("/products-details/{id}")
public String productsDetail(@PathVariable("id") Long id, Model model) {
    ProductDetailDTO productDetailDTO = this.productService.getProductById(id);
    List<String> allSizes = productDetailDTO.getSizes();
    List<String> allPictures = productDetailDTO.getThumbnailUrls();
    CartProductDTO cartProductDTO = new CartProductDTO();

    model.addAttribute("productDetailDTO", productDetailDTO);
    model.addAttribute("allPictures", allPictures);
    model.addAttribute("allSizes", allSizes);
    model.addAttribute("cartProductDTO", cartProductDTO);

    return "product-detail";
}

HTML表单代码

<form th:action="@{/cart/product}" th:object="${cartProductDTO}" th:method="post">
    <input type="number" th:value="${productDetailDTO.getId()}" th:field="*{productId}" th:readonly="${true}" hidden />
</form>

问题原因

th:field会自动覆盖th:value的设置。Thymeleaf的th:field会根据绑定的cartProductDTO对象属性值生成输入框的value,而初始化的cartProductDTO的productId为空,导致最终输入框的实际值为空,提交后无法传递有效数据。

解决方法

方法1:Controller中提前赋值给CartProductDTO

在将cartProductDTO放入Model前,直接设置productId的值:

CartProductDTO cartProductDTO = new CartProductDTO();
cartProductDTO.setProductId(productDetailDTO.getId()); // 新增赋值逻辑

对应的Thymeleaf输入框可简化为:

<input type="number" th:field="*{productId}" th:readonly="true" hidden />

方法2:替换th:field为name属性绑定

去掉th:field,直接用name属性指定参数名,Spring MVC会自动将值绑定到CartProductDTO的对应字段:

<input type="number" name="productId" th:value="${productDetailDTO.getId()}" readonly hidden />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:52:46