Элементы списка Java, повторно добавленные в выпадающий список тимелина при перезагрузке страницы, появляются несколько раз - PullRequest
1 голос
/ 27 июня 2019

Я создаю приложение Spring Boot, которое рассчитывает и отображает выплаты Airbnb ежемесячно. Данные о выплатах извлекаются из Airbnb Api, а информация об учетной записи пользователя сохраняется в базе данных. Я создал форму, в которой пользователь может указать месяц и список для отображения ежемесячной выплаты. Пользователь выбирает листинг (аренду) из выпадающего меню. Чтобы отобразить имена листингов, в модель MVC добавлен атрибут listListDto. Список объектов Listing получен из базы данных и преобразован в список объектов ListingDTO. В этом списке содержится список ListDto.

Когда я перезагружаю страницу формы, списки добавляются в выпадающий список дважды, затем три, четыре и более раз.

Как я мог предотвратить это? Я предполагаю, что мог бы создать сущность ListingListDTO, которая обернула бы список ListingDTO, но я надеялся, что смогу упростить задачу и использовать список ListingDTO непосредственно в модели MVC.

Вот метод Controller, который отображает 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 эта проблема была решена.

1 Ответ

0 голосов
/ 28 июня 2019

Просто скопируйте из комментариев, чтобы ответить на этот вопрос.

Если у вас нет хорошего метода equals () / hashcode () в ListingDTO, тогда ваш вызов contains () не будет делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...