在 Thymeleaf - SpringBoot 中绑定对象



我使用 Spring Initializr、嵌入式 Tomcat + Thymeleaf 模板引擎生成了一个 Spring Boot Web 应用程序,并将打包为可执行的 JAR 文件。

使用的技术 :

Spring Boot 1.4.2.RELEASE,

Spring 4.3.4.RELEASE, Thymeleaf 2.1.5.RELEASE, Tomcat Embedded 8.5.6, Maven 3, Java 8

我有这个课

public class AlarmNotification {
    private Long id;
    private Action action;
    private Application aplication;
    private Device device;
    private TimeLapse timeLapse;
    private Guardian guardian;
    private List<SystemAlarm.Level> level;
    ...
}

和这个模板

<form class="form-style-9" action="#" th:action="@{/alarmNotification/save}" th:object="${alarmNotification}" method="post">
    <ul>
    <li>
       <input type="hidden" th:field="*{id}"       />
        <select name="device" class="field-style field-split align-left">
        <option value="ANDROID">ANDROID</option>
        <option value="IOS">IOS</option>
    </select>
       <select th:field="*{guardian}">
         <option th:each="guardian : ${guardians}" 
             th:value="${guardian.id}" 
             th:text="${guardian.name}"></option>
    </select>   
    </li>   
    <li>
       <select th:field="*{timeLapse}">
         <option th:each="timeLapse : ${timeLapses}" 
            th:value="${timeLapse.id}"
             th:text="${timeLapse.description}"></option>
    </select>   
    </li>
     <li>
       <select th:field="*{level}" multiple="multiple">
         <option th:each="level : ${alarmLevels}" 
             th:value="${level}" 
             th:text="${level}"></option>
    </select> 
    </li>
    <li>        
    </li>
    <li>
        <input type="submit" value="SAVE" />
    </li>
    </ul>
</form>

和控制器:

@RequestMapping(value = { "/save" }, method = RequestMethod.POST)
    public String saveAlarmNotification (@Valid AlarmNotification alarmNotification, BindingResult bindingResult, Model model) throws DataAccessException, SQLException {
        System.out.println  ("<-------------------------------------->");
        System.out.println  (alarmNotification);
        System.out.println  ("<-------------------------------------->");
..
}

但对象 alarmNotification 的所有值均为空,设备和级别除外:

 AlarmNotification [id=null, action=null, aplication=null,
 device=Device [id=null, deviceKey=ANDROID], 
timeLapse=null, guardian=null, 
level=[HIGH, MEDIUM, LOW]]

我认为在您的选择标签中,th:value 不正确,id 设置不正确。

即对于卫报来说应该是这样的

<select th:field="*{guardian}">
      <option th:each="guardian : ${guardians}" 
             th:value="${guardian.id}" 
             th:text="${guardian.name}"></option>
</select>

对于延时摄影应该是这样声明

<select th:field="*{timeLapse}">
     <option th:each="timeLapse : ${timeLapses}" 
         th:value="${timeLapse.id}" 
         th:text="${timeLapse.description}"></option>
</select>  

对于我认为您通过了错误的字段,即它可能看起来像那样

<select th:field="*{level}" multiple="multiple">
             <option th:each="level : ${alarmLevels}" 
                 th:value="${level}" 
                 th:text="${level}"></option>
        </select>

我希望这有所帮助。

最新更新