[英]Strange behaviour of ArrayList in jsf
我正在使用jsf開發Web應用程序。 我嘗試在ArrayList“ materialsSummaryBean.electrolyserMaterialLotList”中使用索引0的元素顯示屬性“ brandName”,並使用“ c:forEach”為所有元素顯示此屬性。
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
#{materialsSummaryBean.electrolyserMaterialLotList.get(0).material.material.brandName}
<br/>
<hr/>
<c:forEach
items="#{materialsSummaryBean.electrolyserMaterialLotList}"
var="item" varStatus="loop">
#{item.material.material.brandName}
<br/>
#{item.material.material.brandName}
<br/>
#{item.material.material.brandName}
<br/>
#{item.material.material.brandName}
<br/>
#{item.material.material.brandName}
<br/>
#{item.material.material.brandName}
<br/>
#{item.material.material.brandName}
<br/>
<hr/>
</c:forEach>
結果,我絕對將索引為0的元素的值列表隨機化:
ШБ-5
ЗШБ класс 4
МШ-39
ЗШБ класс 4
МШ-39
КПД-400И
ШБ-5
МШ-39
對於列表中的所有元素:
ЗШБ класс 4
ЗШБ класс 4
КПД-400И
ЗШБ класс 4
ШБ-5
МШ-39
ЗШБ класс 4
<hr />
ЗШБ класс 4
ЗШБ класс 4
МШ-39
КПД-400И
ЗШБ класс 4
ШБ-5
МШ-39
<hr />
МШ-39
КПД-400И
ЗШБ класс 4
КПД-400И
ЗШБ класс 4
ШБ-5
МШ-39
<hr />
ШБ-5
ЗШБ класс 4
МШ-39
МШ-39
ШБ-5
КПД-400И
МШ-39
<hr />
而且我不知道這是什么,什么是問題。
MaterialsSummaryBean方法“ getElectrolyserMaterialLotList”:
public List<MaterialLotSummaryData> getElectrolyserMaterialLotList() {
MaterialLotFilter materialLotFilter = new MaterialLotFilter();
materialLotFilter.setElectrolyserId(id);
return materialService.getMaterialLotByElectrolyserId(materialLotFilter);
}
和“ getMaterialLotByElectrolyserId”方法:
public List<MaterialLotSummaryData> getMaterialLotByElectrolyserId(MaterialLotFilter materialLotFilter) {
Long electrolyserId = materialLotFilter.getElectrolyserId();
if (electrolyserId == null) {
throw new IllegalArgumentException("Electrolyser id cannot be null.");
}
TypedQuery<Unit> queryUnit = em.createQuery(
"select u from Unit u where u.electrolyser.id = :selectedElectrolyser",
Unit.class)
.setParameter("selectedElectrolyser", electrolyserId);
List<Unit> unitList = queryUnit.getResultList();
HashSet<MaterialLot> materialLotList = new HashSet<MaterialLot>();
HashMap<Long, Double> materialLotUsageMap = new HashMap<Long, Double>();
for (Unit unit : unitList) {
MaterialLot currentMaterialLot = unit.getMaterialLot();
if (currentMaterialLot == null) continue;
materialLotList.add(currentMaterialLot);
Double usage = unit.getActualMaterial().getAmount();
if (!materialLotUsageMap.containsKey(currentMaterialLot.getId())) {
materialLotUsageMap.put(currentMaterialLot.getId(), (usage == null) ? 0 : usage);
} else {
if(usage == null) continue;
Double currentUsage = materialLotUsageMap.get(currentMaterialLot.getId());
materialLotUsageMap.put(currentMaterialLot.getId(), currentUsage + usage);
}
}
List<MaterialLotData> result = mapper.createList(materialLotList, MaterialLotData.class);
MaterialLotSummaryData summaryData;
ArrayList<MaterialLotSummaryData> summaries = new ArrayList<MaterialLotSummaryData>();
for (MaterialLotData materialLot : result) {
if (materialLotUsageMap.containsKey(materialLot.getId())) {
summaryData = new MaterialLotSummaryData();
summaryData.setId(materialLot.getId());
summaryData.setAcceptanceDate(materialLot.getAcceptanceDate());
summaryData.setLotNumber(materialLot.getLotNumber());
summaryData.setMaterial(materialLot.getActualMaterial());
summaryData.setNumber(materialLot.getNumber());
summaryData.setManufacturer(materialLot.getManufacturer());
Double usage = materialLotUsageMap.get(materialLot.getId());
summaryData.setUsage(usage);
summaries.add(summaryData);
materialLotUsageMap.remove(materialLot.getId());
}
}
return summaries;
}
服務方法被稱為electrolyserMaterialLotList
每次訪問,以及通過訪問數據庫並再次執行相同操作而准備的列表,即使對於單項訪問也是如此。 您應該避免這樣做。 基本上,您可以在getter方法中使用null檢查。
public List<MaterialLotSummaryData> getElectrolyserMaterialLotList() {
if(electrolyserMaterialLotList == null)
{
MaterialLotFilter materialLotFilter = new MaterialLotFilter();
materialLotFilter.setElectrolyserId(id);
electrolyserMaterialLotList = materialService.getMaterialLotByElectrolyserId(materialLotFilter);
}
return electrolyserMaterialLotList;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.