Как предотвратить выполнение основного потока на следующей строке, пока последняя строка не будет выполнена полностью - PullRequest
2 голосов
/ 04 марта 2020

Прежде всего, я новичок в Spring-boot. И я хочу отказаться от новостного сайта, чтобы сделать api отдыха. что я делаю, просто создаю маршрут, который отвечает за создание ответа json на последние новости после просмотра сайта новостей. это маршрут

@GetMapping("/latest")
    public ArrayList<Result> scrap() {

        String title = "";
        Document doc;
        Element body ;
        ArrayList<Element> elements = new ArrayList<>() ;

        ArrayList<Result> results = new ArrayList<>();

        ArrayList<Element>li;

        try {

            doc = Jsoup.connect("https://timesofindia.indiatimes.com").get(); //error take place here

            title = doc.title();

            body = doc.body();

            elements = body.getElementsByAttributeValue("data-vr-zone","latest");
            System.out.println("Size "+elements.size());

            li = elements.get(0).select("li > a");

            System.out.println("WHole Data "+li.toString());

            System.out.println(li.size());

        int id = 0;

        for(Element text : li ) {

            id++;

            String link  = "";

            if( text.attr("href") != ""  &&  text.attr("title") != "" ) {
                link = "https://timesofindia.indiatimes.com/" + text.attr("href") ;
                results.add(new Result(id,text.attr("title"),link));
            }       
        }

        } catch (IOException e) {

            e.printStackTrace();    
        }

        return results;
    }

, пожалуйста, кто-нибудь, помогите, как справиться с подобной ситуацией в java.

Поскольку Jsoup.connect().get() делает запрос http, поэтому основной поток его ставит в уникальном потоке для параллельного выполнения и выведите размер ArrayList = 0.

Вот вывод StackTrace:

2020-03-04T12: 18 : 34.410009 + 00: 00 heroku [router]: at = info method = GET path = "/ latest" host = morning-waters-01018.herokuapp.com request_id = 15a8fdba-e541-4aa2-a0df-34838b2e7e5f fwd = "47.30. 171.180 "dyno = web.1 connect = 0ms service = 177ms status = 500 bytes = 473 protocol = https 2020-03-04T12: 18: 34.399950 + 00: 00 app [web.1]: Размер 0 2020-03-04T12: 18: 34.402793 + 00: 00 app [web.1]: 2020-03-04 12: 18: 34.402 ОШИБКА 4 --- [io-17255-exe c -5] oa c. c. C. [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] вызвала исключение [Ошибка обработки запроса; вложенное исключение: java .lang.IndexOutOfBoundsException: индекс: 0, размер: 0] с root причина 2020-03-04T12: 18: 34.402794 + 00: 00 app [web.1]: 2020-03-04T12: 18: 34.402795 + 00: 00 приложение [web.1]: java .lang.IndexOutOfBoundsException: индекс: 0, размер: 0 2020-03-04T12: 18: 34.402796 + 00: 00 приложение [веб.1]: в java .util.ArrayList.rangeCheck (ArrayList. java: 657) ~ [na: 1.8.0_242-heroku] 2020-03-04T12: 18: 34.402797 + 00: 00 app [web.1]: at java .util.ArrayList.get (ArrayList. java: 433) ~ [na: 1.8.0_242-heroku]

1 Ответ

0 голосов
/ 04 марта 2020

Я думаю, что Jsoup.connect("https://timesofindia.indiatimes.com").get() делает syn c вызов.

Вам просто нужно найти причину ошибки.

Самый простой способ

Пожалуйста, измените catch (IOException e) на catch (Exception e).

Добавьте метод main() в тот же исходный файл, скопируйте тело scrap() в main() и запустите метод main() в IDE. Вы можете просто напечатать results (не возвращать их).

Вы можете попытаться отладить код в методе main().

Причина, похоже,

elements = body.getElementsByAttributeValue("data-vr-zone","latest")

elements здесь пусто

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