【问题标题】:Spring Boot form data binding a list with FreeMarkerSpring Boot 表单数据与 FreeMarker 绑定列表
【发布时间】:2019-10-19 18:05:16
【问题描述】:

我正在尝试将我的表单绑定到数据传输对象。该表单是一个 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}"/>

然后它告诉我“数据”为空或丢失。我做错了什么?

【问题讨论】:

  • 关于subclass.id的错误信息意味着subclass存在,但它没有id子变量。
  • 这里不是这样。当我在上面的行上打印 data.subclasses[${subclass?index}] 时,它给了我:Data.Sublclass(id=1,code=1111) 所以它只是 .id 部分似乎不起作用..

标签: java forms spring-boot data-binding freemarker


【解决方案1】:

毕竟我发现了问题:

问题出在TransferObject 中。 Sublclass 类具有 private 访问权限。所以找不到任何吸气剂或二传手。这就是 FreeMarker 模板找不到 .id 属性的原因。

当我尝试在普通 Java 代码中访问 getter 时,出现编译错误: Error:(65, 77) java: getId() in Data.Subclass is defined in an inaccessible class or interface 在我看来,这比惊呼它为空或丢失要好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多