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

时间:2016-11-10 18:16:03

标签: java spring mongodb spring-mvc thymeleaf

我尝试使用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;
}

可能的商品类:

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 个答案:

答案 0 :(得分:1)

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

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

这里有3个变量

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

因为在你的每一个中,你将变量指定为商品,你可能需要做这样的事情:

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