使用 spring、thymeleaf 和 mongo 填充 html 选择

Posted

技术标签:

【中文标题】使用 spring、thymeleaf 和 mongo 填充 html 选择【英文标题】:Populate an html select with spring, thymeleaf, and mongo 【发布时间】:2017-03-24 21:12:04 【问题描述】:

我正在尝试使用 Spring 和 Thymeleaf 使用 Mongo 集合中的数据填充 html 选择。我已经尝试遵循这些问题的建议:"how do I populate a drop down with a list using thymeleaf and spring"、"how to bind an object list with thymeleaf" 和"spring app not finding property on object",但我没有任何运气。

当我在我的 HTML 中使用这种语法时,

<div class="form-group">
        <label for="commoditiesSelect"> Commodities: </label>
        <select multiple="Commodities" id="commoditiesSelect" class="form-control" th:field="*commodities">
           <option th:each="commodity : $possibleCommoditiesList"
                   th:text="$possibleCommodities"
                   th:value="$possibleCommodities"
           />
        </select>
    </div>

我只是在网页上得到一个空白列表供我选择。但是,我知道我发送给我的模型的列表有多个对象,其中包含信息(通过调试)。我弄乱了语法,但我得到的最接近的是指向网页上显示的对象的指针。有谁知道我哪里出错了?下面包括我的控制器、服务实现、PossibleCommodities 类和PossibleCommoditiesRepository 类。

控制器:

@GetMapping("/welcomeMatForm")
public String welcomeMatForm(Model model) 
    List<PossibleCommodities> possibleCommoditiesList = welcomeMatService.getPossibleCommodities();
    model.addAttribute("possibleCommoditiesList", possibleCommoditiesList);
    model.addAttribute("welcomeMatForm", new WelcomeMatForm());
    return "welcomeMatForm";

服务实现类:

    public List<PossibleCommodities> getPossibleCommodities()
    List<PossibleCommodities> listOfCommodities = possibleCommoditiesRepository.findAll();
    return listOfCommodities;

PossibleCommodities 类:

package com.sensus.analytics.welcomemat.core.model;

import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "possible_commodities")
@TypeAlias("PossibleCommodities")
public class PossibleCommodities extends BasicMongoDocument

public String commodityName;
private int commodityId;

public String getCommodityName(int commodityId) 
    return commodityName;


public void setCommodityName(String commodityName) 
    this.commodityName = commodityName;


public int getCommodityId(String commodityName)
    return commodityId;


public void setCommodityId(int commodityId) 
    this.commodityId = commodityId;


PossibleCommoditiesRepository 类:

package com.sensus.analytics.welcomemat.core.repository;

import com.sensus.analytics.welcomemat.core.model.PossibleCommodities;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;

public interface PossibleCommoditiesRepository extends MongoRepository<PossibleCommodities, String>  
public List<PossibleCommodities> findAll();

编辑:我也尝试过这种 HTML 通用语法:

<div class="form-group">
        <label for="commoditiesSelect"> Commodities: </label>
        <select multiple="Commodities" id="commoditiesSelect" class="form-control" th:field="*commodities">
           <option th:each="commodity : $possibleCommoditiesList"
                   th:text="$possibleCommodities.commodityName"
                   th:value="$possibleCommodities.commodityName"
           />

        </select>
    </div>

但它给了我这个错误:EL1007E:(pos 0): Property or field 'commodityName' cannot be found on null

【问题讨论】:

【参考方案1】:

在这样的一行中,您必须知道变量的定义位置:

<option th:each="commodity : $possibleCommoditiesList" th:text="$possibleCommodities" th:value="$possibleCommodities" />

这里有 3 个变量

commodity -- 由 th:each 表达式定义 possibleCommoditiesList - 通过将其添加到模型(在您的控制器中)来定义 possibleCommodities - 没有在任何地方定义。这会解析为 null,因此您会得到一个空白选项列表。在您的第二个示例中,错误是由 thymleaf 尝试在 null 对象上调用 getCommodityName() 引起的。李>

由于在您的 th:each 中,您将变量指定为商品,您可能需要执行以下操作:

<option th:each="commodity : $possibleCommoditiesList" th:text="$commodity.commodityName" th:value="$commodity.commodityName" />

【讨论】:

以上是关于使用 spring、thymeleaf 和 mongo 填充 html 选择的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中使用thymeleaf

页面重定向取决于使用 Spring 安全性和 Thymeleaf 的角色 - Spring

如何使用 thymeleaf 和 spring 使用列表填充下拉列表

这是不是可以使用 thymeleaf 和 spring 以 utf-8 编码将 html 代码注入 html 页面

Spring Boot 和 Thymeleaf:链接列表

Spring 安全性和 Thymeleaf 不起作用