java - Spring Boot 表单数据与 FreeMarker 绑定列表
问题描述
我正在尝试将我的表单绑定到数据传输对象。该表单是一个 FreeMarker 模板。它们如下:
数据对象:
@Data
public class TransferObject {
private List<Subclass> subclassInstances;
public TransferObject(Data data) {
// this takes the data and populates the object, also works
// we end up with a list of subclasses.
}
@Data //lombok -> generates getters and setters
@AllArgsConstructor
private static class Subclass {
private String id;
private String code;
}
}
控制器:
@GetMapping({"/endpoint", "/endpoint"})
public String endpoint(Model model, @RequestParam(value="code", required=false, defaultValue="") String code) {
// this retrieves the data, but that works so it's irrelevant here
Data data = this.dataService.findByCode(code).orElse(null);
if(data != null) {
TransferObject transferObject = new TransferObject(data);
model.addAttribute("data", transferObject);
} else {
log.warn("no data found");
}
return "endpoint";
}
Freemarker 模板:
<form:form action="/endpoint" method="post" modelAttribute="data">
<#if data??>
<#list data.subclasses as subclass>
${subclass} <!-- this shows an object with 2 fields that are filled -->
<@spring.bind "data.subclasses[${subclass?index}].id"/>
<input type="text" value="${subclass.id}"/> <!-- This line fails -->
<@spring.bind "data.subclasses[${subclass?index}].code"/>
<input type="text" value="${subclass.code}"/>
</#list>
</#if>
</form:form>
模板中有一个错误指出:
[以下已评估为 null 或缺失:==> sublcass.id] 我不明白,因为我打印了上面的子类,它就在那里..
我也试过改变
<input type="text" value="${subclass.id}"/>
至
<input type="text" value="${data.subclasses[subclass?index].id}"/>
但随后它告诉我“数据”为空或丢失。我究竟做错了什么?
解决方案
毕竟我发现了这个问题:
问题出在TransferObject 中。Sublclass 类具有private
访问权限。所以找不到任何吸气剂或二传手。这就是 FreeMarker 模板找不到该.id
属性的原因。
当我尝试在普通 Java 代码中访问 getter 时,出现编译错误:
Error:(65, 77) java: getId() in Data.Subclass is defined in an inaccessible class or interface
在我看来,这比惊呼它为 null 或丢失要好。
推荐阅读
- reactjs - 如何从外部应用程序检查反应应用程序版本
- sql - 搜索不同的表?
- reactjs - 无法在 useEffect 中卸载 useRef eventListener
- python-3.x - Matplotlib 动画:动画散点图,连同 imshow 和静态图?
- python - VSCODE 自动补全在模块 matplotlib.widgets 中找不到类 Slider
- c# - 在使用属性注入时,我们如何知道什么是“本地默认值”?
- swift - 合并:取消一组
或删除其所有存储的对象以停止订阅 - upload - 在 env Gradle7+ 中使用 Mavan-Pulish 上传工件到 Nexus 失败
- python - 如何在 python 中删除表的某些行?
- javascript - React - FlatList extraData 不适用于记忆/纯组件