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

