2016-11-10 89 views
1

我想填充一个使用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选择春天,百里香和蒙戈

当我在我的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 - 由第定义:每个表达式
  • possibleCommoditiesList - 通过将其添加到模型(在控制器中)中所定义
  • possibleCommodities - 不任何地方所定义。这解决为空,所以你会得到一个空白选项列表。对于第二个示例,错误是由thymleaf试图在空对象上调用getCommodityName()引起的。

由于您日:每次,你指定的变量作为商品,你可能需要做这样的事情:

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

它的工作!非常感谢你的帮助!!!!! –