【问题标题】:Binding checkbox in Thymeleaf + Spring MVCThymeleaf + Spring MVC中的绑定复选框
【发布时间】:2016-05-27 16:59:53
【问题描述】:

我的 Spring MVC 应用基于 Spring boot 1.2.8、Thymeleaf、Hibernate 和 Hateos。我有一个实体“市场”,其中包含布尔类型的“启用”字段。

@Entity
@Table(name = "market")
public class Market {
.....
private Boolean enabled;
....
public Boolean getEnabled() {
        return enabled;
    }

    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }
}

“/create”控制器中的代码

@RequestMapping(value = "/create", method = RequestMethod.GET)
public ModelAndView create() {
    return new ModelAndView("market/create")
            .addObject("list", linkTo(methodOn(MarketController.class).list())
                    .withRel("List"))
            .addObject("market", new Market())
            .addObject("postLink",
                    linkTo(methodOn(MarketController.class).save(null, null, null, null))
                            .withRel("Save"));
}

模板“市场/创建”,参考。 http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#checkbox-fields

    <form th:action="${postLink.href}" th:object="${market}" method="post">
        ....
        <div class="form-group">
            <label th:for="${#ids.next('enabled')}" th:text="#{market.enabled}">Enabled</label>
            <input type="checkbox" th:field="*{enabled}" />
        </div>
        ....
    </form>

在浏览器中打开 /markets/create 时,勾选复选框出现以下异常

Cause: org.thymeleaf.exceptions.TemplateProcessingException Attribute "value" is required in "input(checkbox)" tags when binding to non-boolean values 

为什么 Thymeleaf 将“启用”字段视为非布尔类型?我已尽我所能找出原因,但徒劳无功。请给出一些提示来解决它。谢谢。

【问题讨论】:

    标签: hibernate spring-mvc spring-boot thymeleaf


    【解决方案1】:

    控制器

    @Controller
    public class BaseController {
    
        @GetMapping("/")
        private String index(DemoDto demoDto){
            return "index";
        }
    
        @PostMapping("/")
        private String receiveValues(DemoDto demoDto) {
            System.out.println(demoDto);
            return "index";
        }
    
    }
    

    DTO

    public class DemoDto {
        private String name;
        private boolean global;
    
        //getter setter for name
    
        public boolean isGlobal() {
            return global;
        }
        public void setGlobal(boolean global) {
            this.global = global;
        }
    
        //toString()
    }
    

    HTML

    <body>
        <form th:action="@{/}" th:method="post" th:object="${demoDto}">
            <label>Enter Name:</label> 
                <input type="text" th:field="*{name}" name="name"> 
            <br/>
            <label>Global</label>
                <input type="checkbox" th:field="${demoDto.global}"/>
            <input type="submit" value="Submit">
        </form>
    
    </body>
    

    这里最重要的是你如何定义th:field="${demoDto.global}"$ 和对象名称 demoDto 都是必需的。

    会生成html代码。

    <body>
        <form action="/" method="post">
            <label>Enter Name:</label> 
                <input type="text" name="name" id="name" value=""> 
            <br/>
            <label>Global</label>
                <input type="checkbox" id="global1" name="global" value="true"/>
                <input type="hidden" name="_global" value="on"/>
            <input type="submit" value="Submit">
        </form>
    
    </body>
    

    从 ui 提交时收到:

    DemoDto [name=Dev, global=true]
    

    【讨论】:

    • 非常感谢!我最终找到了如何使用复选框实现表单的简单易懂的示例。请问您可以添加带有多个复选框的示例吗?
    【解决方案2】:

    无论如何,属性value是必需的。

    试试这样的:&lt;input type="checkbox" th:field="*{enabled}" value="true" /&gt;。检查输入时,enabled 字段应由true 设置; nullotherwise。

    【讨论】:

    • 感谢大卫,我之前尝试过使用“值”,但保存在 DB 中时它会被忽略。据我了解,没有必要在表单中添加“价值”,由春豆支持,由百里香完成。如果我错了,请纠正我。例子。 github.com/thymeleaf/thymeleafexamples-stsm/blob/2.1-master/src/…,寻找
    • 你是对的,对不起,我弄错了,如果你删除value属性,属性enabled应该被初始化。
    • 是的,也试过了。在实体类中设置了“private Boolean enabled = Boolean.FALSE”,但 thymeleaf 并未将其视为“布尔值”并继续抛出异常。我正在查看示例github.com/thymeleaf/thymeleafexamples-stsm/blob/2.1-master/src/…,它有一个布尔类型的“覆盖”字段。
    • 在生成的 HTML 中是否有 value 属性且具有非空值?根据源码可知,post过程中value为null时会触发该异常。
    【解决方案3】:

    尝试将您的属性命名为“启用”以外的其他名称,也许是“市场启用”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 2016-11-29
      • 2018-06-09
      • 1970-01-01
      相关资源
      最近更新 更多