我尝试使用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
答案 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}" />