Thymeleaf报错EL1007E找不到name字段,IDEA标红platform属性问题
错误原因
- Thymeleaf模板存在语法错误与属性引用错误
- 页面
<h3>标签内引用${ad.name},但Controller仅向模型中添加了adDto对象,没有ad属性,此处ad为null,调用name属性直接触发EL1007E报错 <option>标签内的th:value、th:selected、th:text属性中多写了多余的*符号,不符合Thymeleaf表达式语法;同时如果遍历的platforms列表中存在null元素,调用platform.name也会触发同款报错- 表单已经通过
th:object="${adDto}"绑定了对象,后续th:field属性不需要再加adDto.前缀,现有*{adDto.name}、*{adDto.platformsIds}的写法属于绑定错误 <select>标签内部嵌套了多余的<div>标签,不符合HTML规范,可能导致模板解析异常
- 页面
- 后端代码逻辑存在缺陷
PlatformDTO被定义为Platform的非静态内部类,实例化需要依赖外部类Platform的实例,静态方法toDTO中直接new PlatformDTO()会存在实例化异常风险PlatformDTO.toDTO、AdDTO构造方法中对集合执行stream操作前没有做空值校验,如果Platform的ads属性、Ad的platforms属性为null,会直接抛出空指针,最终可能导致返回的DTO对象为null- Controller中转换
Platform到PlatformDTO时没有过滤null元素,PlatformDTO.toDTO方法遇到null入参直接返回null,会导致platforms列表中存在null元素,遍历到null元素时调用name属性就会触发报错
解决方案
1. 修复Thymeleaf模板
修改ad-edit.html对应代码:
- 将页面顶部
${ad.name}改为${adDto.name} - 修正
th:field写法,去掉adDto.前缀,同时移除select内多余的div,修正option的表达式:
<form th:object="${adDto}" th:action="@{/ads/{id}/edit}" method="post"> <input type="text" th:value="${adDto.name}" th:field="*{name}" placeholder="Введите название обьявления" class="form-control"> <input type="text" th:value="${adDto.assetUrl}" th:field="*{assetUrl}" placeholder="Введите ссылку на рекламу" class="form-control"> <select class="form-control" th:field="*{platformsIds}" multiple="multiple" > <option th:each="platform : ${platforms}" th:value="${platform.id}" th:selected="${adDto.platformsIds.contains(platform.id)}" th:text="${platform.name}"> </option> </select> <button type="submit" class="btn btn-success">Редактировать</button> </form>
2. 修复后端代码
- 把
PlatformDTO改为独立的公共类,或者给PlatformDTO添加static修饰符改为静态内部类,避免实例化依赖外部类 - 给所有stream操作的集合添加空值校验:
// 修正PlatformDTO的platformAdsIds方法 static List<Integer> platformAdsIds(List<Ad> ads){ if(ads == null) { return Collections.emptyList(); } return ads.stream().map(Ad::getId).collect(Collectors.toList()); } // 修正Ad类的adPlatformIds方法 List<Integer> adPlatformIds(List<Platform> platforms){ if(platforms == null) { return Collections.emptyList(); } return platforms.stream().map(Platform::getId).collect(Collectors.toList()); }
- Controller中转换DTO时过滤null元素,避免列表中出现null值:
List<PlatformDTO> platformDTOList = platforms.stream() .filter(Objects::nonNull) .map(PlatformDTO::toDTO) .collect(Collectors.toList());
3. 解决IDEA标红问题
上述问题全部修复后,IDEA的Thymeleaf语法检测识别到正确的模型参数和属性后,标红提示会自动消失。如果仍有标红,可以右键项目选择Maven -> Reload Project刷新项目,或者重启IDEA的语法检测即可。
内容的提问来源于stack exchange,提问作者Денис Короленко
相关产品推荐
相关产品推荐

