我正在构建一个弹簧启动应用程序,该应用程序每月计算和显示Airbnb支出。从Airbnb API中获取支出数据,用户帐户信息存储在数据库中。我创建了一个表格,用户可以在其中指定月份和清单以显示每月支出。用户从下拉菜单中选择清单(租赁(。为了显示列表的名称,将listinglistdto属性添加到MVC模型中。从数据库中获得了清单实体的列表,并将其转换为列表列表的实体列表。此列表给出了listinglistdto。
当我重新加载表单页面时,将列表读取到下拉列表,出现两次,然后是三个,四次和更多次。
我如何防止这种情况发生?我假设我可以创建一个listinglistdto实体,该实体可以包装列表列表,但是我希望能够使事情保持简单,并直接在MVC模型中使用ListingDtos的列表。
。这是显示HTML表格的控制器方法:
@RequestMapping(value = "payout", method = RequestMethod.GET)
public String payoutSelection(Model model, RedirectAttributes redirectAttributes) {
Long userId = sessionService.getCurrentUserId();
if (null == userId) {
return loginService.handleInvalidLogin("payout", redirectAttributes);
} else {
PayoutSelectionDTO payoutSelectionDto = new PayoutSelectionDTO();
LocalDate lastMonth = LocalDate.now().minusMonths(1);
payoutSelectionDto.setYear(lastMonth.getYear());
payoutSelectionDto.setMonth(lastMonth.getMonthValue());
Optional<User> user = userService.getUserById(userId);
model.addAttribute("payoutSelectionDto", payoutSelectionDto);
model.addAttribute("listingListDto", listingListDtoService.getListingListDTO(listingService.getListingsByUser(user.get())));
return "payout_monthpicker.html";
}
}
这是包含列表下拉列表的表格:
<body>
<div class="content-block">
<form action="#" th:action="@{/get_payouts}"
th:object="${payoutSelectionDto}" method="POST">
<h2>Kifizetések lekérése</h2>
<div class="content-group">
<select th:field="*{year}">
<option th:value="${payoutSelectionDto.year} -1"
th:text="${payoutSelectionDto.year} -1"></option>
<option th:value="*{year}" th:text="*{year}"></option>
</select> <select th:field="*{month}">
<option th:value="'1'" th:text="Január"></option>
<option th:value="'2'" th:text="Február"></option>
<option th:value="'3'" th:text="Március"></option>
<option th:value="'4'" th:text="Április"></option>
<option th:value="'5'" th:text="Május"></option>
<option th:value="'6'" th:text="Június"></option>
<option th:value="'7'" th:text="Július"></option>
<option th:value="'8'" th:text="Augusztus"></option>
<option th:value="'9'" th:text="Szeptember"></option>
<option th:value="'10'" th:text="Október"></option>
<option th:value="'11'" th:text="November"></option>
<option th:value="'12'" th:text="December"></option>
</select>
</div>
<div class="content-group">
<select th:field="*{listingId}">
<option th:each="listingDto : ${listingListDto}" th:value="${listingDto.airbnbId}" th:text="${#strings.abbreviate(listingDto.airbnbLabel,30)}"></option>
</select>
</div>
<div class="content-group">
<button type="submit" class="btn btn-primary btn-lg btn-block">Lekérés indítása</button>
</div>
</form>
</div>
</body>
这是ListingListDtoService。它有一种筛选重复项的方式,因此,除非这没有做我认为正在做的事情,否则不应从运行此服务的结果中出现重复。
@Service
public class ListingListDTOService {
List<ListingDTO> listingDtoList;
public ListingListDTOService() {
this.listingDtoList = new ArrayList<>();
}
public List<ListingDTO> getListingListDTO(List<Listing> listingList) {
for(Listing listing : listingList) {
ListingDTO listingDto = convertListingToListingDTO(listing);
if(!listingDtoList.contains(listingDto)) {
listingDtoList.add(listingDto);
}
else {
System.out.println("identical Dto found in list while adding Dtos.");
}
}
return listingDtoList;
}
public ListingDTO convertListingToListingDTO(Listing listing) {
ListingDTO listingDto = new ListingDTO();
listingDto.setAirbnbId(listing.getAirbnbId());
listingDto.setAirbnbLabel(listing.getAirbnbLabel());
listingDto.setAirbnbPictureUrl(listing.getAirbnbPictureUrl());
return listingDto ;
}
}
感谢@Seth的Coments,此问题已解决。
只是从评论中复制来回答这个。
如果您在listingdto上没有良好的equals((/hashcode((方法,则您的contains((呼叫将不会执行您想要的。