Spring 引导表单数据与 FreeMarker 绑定列表
Spring Boot form data binding a list with 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>
模板中有错误指出:
[以下已评估为空或缺失:
==> sublcass.id] 我不明白,因为我在上面打印了子类,它就在那里..
我也试过改
<input type="text" value="${subclass.id}"/>
到
<input type="text" value="${data.subclasses[subclass?index].id}"/>
但它告诉我 'data' 为空或缺失。我做错了什么?
终于找到问题了:
问题出在 TranferObject 中。 Sublclass class 具有 private
访问权限。所以找不到任何 getters 或 setter。这就是为什么 FreeMarker 模板找不到 .id
属性.
当我尝试以正常的 Java 代码访问 getter 时,出现编译错误:
Error:(65, 77) java: getId() in Data.Subclass is defined in an inaccessible class or interface
在我看来,这比惊呼它为空或缺失要好。
我正在尝试将我的表单绑定到数据传输对象。该表单是一个 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>
模板中有错误指出:
[以下已评估为空或缺失:
==> sublcass.id] 我不明白,因为我在上面打印了子类,它就在那里..
我也试过改
<input type="text" value="${subclass.id}"/>
到
<input type="text" value="${data.subclasses[subclass?index].id}"/>
但它告诉我 'data' 为空或缺失。我做错了什么?
终于找到问题了:
问题出在 TranferObject 中。 Sublclass class 具有 private
访问权限。所以找不到任何 getters 或 setter。这就是为什么 FreeMarker 模板找不到 .id
属性.
当我尝试以正常的 Java 代码访问 getter 时,出现编译错误:
Error:(65, 77) java: getId() in Data.Subclass is defined in an inaccessible class or interface
在我看来,这比惊呼它为空或缺失要好。