SpringBoot Thymeleaf中SpelEvaluationException EL1008E错误咨询
解决Thymeleaf中遍历集合关联属性的SpEL错误
这个错误很典型,咱们先拆解一下问题根源:
你写的${device.driverDevices.driver}里,device.driverDevices是一个PersistentSet集合(也就是JPA关联的Set<DeviceDriver>),集合本身并没有driver这个属性,SpEL自然找不到它,所以抛出了EL1008E错误。
要解决这个问题,你需要先遍历driverDevices集合里的每一个DeviceDriver对象,再从每个对象里获取对应的Driver实例。下面给你几种可行的方案:
方案1:直接遍历DeviceDriver集合
这是最直接的修正方式,先循环device.driverDevices中的每个DeviceDriver,再访问它的driver属性:
<select id="selectCompanyElementId"> <option value="0">select</option> <!-- 遍历每个DeviceDriver实例 --> <option th:each="deviceDriver : ${device.driverDevices}" th:value="${deviceDriver.driver.id}" th:text="${deviceDriver.driver.firstName}"> </option> </select>
方案2:去重处理(避免重复Driver选项)
如果同一个TdkDevice关联的多个DeviceDriver指向同一个Driver,下拉框会出现重复选项。这时可以用Thymeleaf的集合工具类+SpEL投影来去重:
<select id="selectCompanyElementId"> <option value="0">select</option> <!-- 先投影出所有Driver,再转成Set去重 --> <option th:each="driver : ${#sets.toSet(device.driverDevices.![driver])}" th:value="${driver.id}" th:text="${driver.firstName}"> </option> </select>
这里的device.driverDevices.![driver]是SpEL的投影操作,会把集合中每个DeviceDriver的driver属性提取出来,形成一个新的集合;再用#sets.toSet()转成Set自动去重。
方案3:后端封装(更优雅的方式)
如果不想在前端处理集合逻辑,可以在TdkDevice实体类中添加一个获取唯一Driver集合的方法:
import java.util.Set; import java.util.stream.Collectors; public class TdkDevice { // 你的其他属性和关联关系... private Set<DeviceDriver> driverDevices; // 添加这个方法 public Set<Driver> getUniqueDrivers() { return driverDevices.stream() .map(DeviceDriver::getDriver) .collect(Collectors.toSet()); } // getter和setter... }
然后在Thymeleaf中直接遍历这个封装好的集合:
<select id="selectCompanyElementId"> <option value="0">select</option> <option th:each="driver : ${device.uniqueDrivers}" th:value="${driver.id}" th:text="${driver.firstName}"> </option> </select>
这种方式把集合处理逻辑放在后端,前端代码更简洁,也更符合MVC的职责划分。
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

