Могу ли я использовать htmlunit в веб-службе?

Я пытался использовать htmlunit внутри функции веб-службы. Я новичок в веб-сервисах и использовал это руководство для реализации простого веб-сервиса: http://www.eclipse.org/webtools/community/education/web/t320/Implementing_a_Simple_Web_Service.pdf

Затем я попытался реализовать веб-службу, которая будет получать 3 строки в качестве параметров, переходить на веб-сайт с помощью htmlunit, заполнять формы на сайте с помощью 3 строк и нажимать кнопку поиска, анализировать страницу результатов и возвращать строку, содержащую информация со страницы результатов. Я пошел с наивным подходом и попытался реализовать этот веб-сервис, используя те же шаги, что и в учебнике. Шаги были:

  1. создать динамический веб-проект
  2. добавьте банку htmlunit в путь сборки.
  3. реализовать рабочий тест junit как функцию и добавить в проект
  4. создайте веб-сервер и клиент с помощью мастера веб-службы eclipse.

После этого мастер сгенерировал простой интерфейс с 3 текстовыми полями, и я ввел значения, которые работали в тестовом проекте junit. Но я получил исключение, в котором говорилось:

Exception: java.lang.reflect.InvocationTargetException Message: java.lang.reflect.InvocationTargetException

Поскольку я действительно новичок в веб-сервисах, совершил ли я ужасную ошибку, когда подумал, что шаги для простого веб-сервиса в учебнике будут работать для этого, или это какая-то ошибка, которую можно исправить? В общем, могу ли я использовать htmlunit таким образом или это совершенно невозможно?

Код веб-сервера приведен ниже:

package webService.test.TravelComparing;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class TravelComparingTest {

public String homePage(String place, String checkinDate, String checkoutDate) throws Exception {
    final WebClient webClient = new WebClient();

String URL = "http://hotels.travelcomparing.com/SearchResults.aspx?languageCode=EN&currencyCode=EUR&destination=place:" + place + "&radius=0km&checkin=" + checkinDate +"&checkout=" + checkoutDate + "&Rooms=1&adults_1=1&pageSize=15&pageIndex=0&sort=MinRate-asc&showSoldOut=false&view=hc_sr_summary&scroll=0&mapstate=contracted";

HtmlPage page = webClient.getPage(URL);
webClient.waitForBackgroundJavaScript(10000);
String htmlContent = page.asXml();
Writer out = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream("travelcomparing.html"), "UTF-8"));
    try {
        out.write(htmlContent);
    } finally {
        out.close();
    }

    String hotelName = "";
    String priceFrom = "";

    String result = "";

    for (int i = 0; i < 5; i++){

        int index1 = htmlContent.indexOf ( "<div fn=");
        int index2 = htmlContent.indexOf("<div fn=", index1 + 8);
        String row = (String) htmlContent.subSequence(index1 , index2);
        htmlContent = htmlContent.substring(index2);
        //System.out.println(row);

        int index3 = row.indexOf("class=\"hc_i_hotel\" p=\"2\">");
        int index4 = row.indexOf("</a>", index3);
        hotelName = (String) row.subSequence(index3 + 61, index4 -34);
        System.out.println(hotelName);
        result = result + hotelName + " ";

        int index5 = row.indexOf("<dd class=\"hc_i_price\">");
        int index6 = row.indexOf("</dd>", index5);
        String priceRow = (String) row.subSequence(index5, index6 + 5);

        int index7 = priceRow.indexOf("<span class=\"hc_pr_syb\">");
        int index8 = priceRow.indexOf("<span class=\"hc_pr_cur\">");
        priceFrom = (String) priceRow.subSequence(index7 + 148, index8 - 38);
        System.out.println(priceFrom);
        result = result + priceFrom + "    ";
    }
    return result;
}

}

РЕДАКТИРОВАТЬ:

полное содержимое консоли tomcat приведено ниже. Упомянутое мной исключение отображается в представлении результатов клиента, и я не смог найти его больше нигде.

May 20, 2013 7:17:15 AM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre7\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre7/bin/client;C:/Program Files/Java/jre7/bin;C:/Program Files/Java/jre7/lib/i386;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files\QuickTime\QTSystem\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\eclipse;;.
May 20, 2013 7:17:15 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TravelComparingTest' did not find a matching property.
May 20, 2013 7:17:15 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TravelComparingTestClient' did not find a matching property.
May 20, 2013 7:17:15 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TravelComparing2' did not find a matching property.
May 20, 2013 7:17:15 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TravelComparing2Client' did not find a matching property.
May 20, 2013 7:17:15 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:traveltest' did not find a matching property.
May 20, 2013 7:17:15 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:traveltestClient' did not find a matching property.
May 20, 2013 7:17:15 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
May 20, 2013 7:17:15 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
May 20, 2013 7:17:15 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 410 ms
May 20, 2013 7:17:15 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
May 20, 2013 7:17:15 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.40
May 20, 2013 7:17:16 AM org.apache.axis.utils.JavaUtils isAttachmentSupported
WARNING: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
May 20, 2013 7:17:17 AM org.apache.axis.utils.JavaUtils isAttachmentSupported
WARNING: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
May 20, 2013 7:17:17 AM org.apache.axis.utils.JavaUtils isAttachmentSupported
WARNING: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
May 20, 2013 7:17:17 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
May 20, 2013 7:17:17 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
May 20, 2013 7:17:17 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2044 ms
May 20, 2013 7:17:19 AM org.apache.axis.utils.JavaUtils isAttachmentSupported
WARNING: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.

person ManahManah    schedule 20.05.2013    source источник
comment
Да, вы можете использовать htmlunit для этого, при условии, что машина, на которой будет работать веб-сервер (с веб-службой), имеет доступ к Интернету (или, по крайней мере, к этому сайту). Ваше исключение кажется слишком маленьким, можете ли вы опубликовать всю трассировку стека?   -  person acdcjunior    schedule 20.05.2013
comment
Я добавлю всю трассировку стека к вопросу. Кстати, вы не знаете, могу ли я использовать селен таким же образом? Я не уверен из-за всплывающего окна firefox и всего остального.   -  person ManahManah    schedule 20.05.2013
comment
Вы можете использовать селен с htmlunit в качестве браузера вместо firefox. Только Firefox откроет окна, как вы и предсказывали. Есть способы не открывать окна (например, настроить удаленный сервер selenium или что-то в этом роде), но это продвинутые вещи.   -  person acdcjunior    schedule 20.05.2013
comment
так у вас есть идея о причине исключения?   -  person ManahManah    schedule 20.05.2013
comment
Короткий ответ, да, вы можете его использовать.   -  person quarks    schedule 20.05.2013
comment
но могу ли я использовать его в шагах, описанных в вопросе? Или я что-то упускаю, и это вызывает исключение? Боюсь, мне понадобится немного больше, чем короткий ответ.   -  person ManahManah    schedule 20.05.2013


Ответы (1)


Я, наконец, решил эту проблему, удалив код записи файла и окружив все необходимые поля блоком try catch. Причина, по которой возникает это исключение, по-видимому, заключается в исключении ввода-вывода в функции, но когда используется отражение, оно показывает исключение в вопросе вместо исключения ввода-вывода.

person ManahManah    schedule 21.05.2013