Решение для StackOverflowError

хотите выполнить поиск по городу из адресной таблицы.

Сущность: Гостиница

@JsonManagedReference
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "hotel")
    private List<Address> address;

Объект: Адрес

@ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "hotel_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonBackReference
    private Hotel hotel;

контроллер:

@GetMapping("/forSearch")
    public String searchHotelPage(Model model, Address address){
        model.addAttribute("address", address);
        return "search-hotel";
    }

    @GetMapping("/search-hotel-city/{city}")
    public String searchHotel(@RequestParam("city") String city, Model model){
        List<Address> addresses = addressService.searchAddressByCity(city);
        System.out.println("this is address: "+ addresses);
        model.addAttribute("address",addresses );
        return "search-hotel";
    }

услуга:

public List<Address> searchAddressByCity(String city) {
        return addressRepository.findAll();
    }

поиск и просмотр списка:

<form th:action = "@{/search-hotel-city/city?city=${address.city}}" method = "get">
            <div class = "form-group mb-2">
                <input type = "text" class = "form-control" name = "city" id = "city" placeholder = "Search "/>
                <input type = "submit" value = "search" class = "btn btn-primary">   
            </div>
        </form>

        <hr/>

        <table class = "table">
            <thead>
            <tr>
                <th scope = "col">Id</th>
                <th scope = "col">roadNumber</th>
                <th scope = "col">city</th>
                <th scope = "col">country</th>
            </tr>
            </thead>
            <tbody>
            <tr th:each = "address: ${addresses}">
                <th scope = "row" th:text = "${address.id}"></th>
                <td th:text = "${address.roadNumber}"></td>
                <td th:text = "${address.city}"></td>
                <td th:text = "${address.country}"></td>
            </tr>

            </tbody>
        </table>

Ошибка:

Hibernate: select address0_.hotel_id as hotel_id5_0_0_, address0_.id as id1_0_0_, address0_.id as id1_0_1_, address0_.city as city2_0_1_, address0_.country as country3_0_1_, address0_.hotel_id as hotel_id5_0_1_, address0_.road_number as road_num4_0_1_ from address address0_ where address0_.hotel_id=?
2019-07-28 12:58:28.184 ERROR 9836 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

java.lang.StackOverflowError: null
    at java.lang.Exception.<init>(Exception.java:102) ~[na:1.8.0_212]
    at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89) ~[na:1.8.0_212]

Я хочу найти город. но когда я ищу StackOverflowError происходит. Я пытался, но не смог решить эту проблему. пожалуйста, помогите мне. спасибо

Удалите System.out.println("this is address: "+ addresses); из searchHotel и дайте мне знать

Romil Patel 28.07.2019 09:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
799
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удалите System.out.println("this is address: "+ addresses); из searchHotel. Это может привести к бесконечным вызовам, которые приводят к StackOverflowError.

Возможные причины:

  • Метод toString() для большинства реализаций List повторяет через элементы Список и вызывает toString() для них. 1
  • используя Lombok, с вашей автоматикой, сгенерированный хэш-код использовался сбором, поэтому работает бесконечные звонки2

Другие вопросы по теме