Нет исходного кода для типа: Ошибка компиляции GWT
Я пытаюсь получить запросы сервлетом в своем приложении GWT. При компиляции кода я получаю эти ошибки.
[ERROR] Line 16: No source code is available for type org.apache.http.client.ClientProtocolException; did you forget to inherit a required module?
[ERROR] Line 16: No source code is available for type org.apache.http.ParseException; did you forget to inherit a required module?
[ERROR] Line 16: No source code is available for type org.json.simple.parser.ParseException; did you forget to inherit a required module?
Что делать, чтобы удалить эти ошибки?
Эти классы не поддерживаются GWT?
Ниже приведен код, который я использую
public String getJSON() throws ClientProtocolException, IOException, ParseException{
HttpClient httpclient = new DefaultHttpClient();
JSONParser parser = new JSONParser();
String url = "some - url - can't disclose";
HttpResponse response = httpclient.execute(new HttpGet(url));
JSONObject json_data = (JSONObject)parser.parse(EntityUtils.toString(response.getEntity()));
JSONArray results = (JSONArray)json_data.get("result");
}
Этот код работает нормально Если я использую это в обычном java-проекте/консольном приложении.
Ответы
Ответ 1
Java-код, запущенный в GWT, переводится в Javascript, поэтому некоторые классы, работающие в JVM, не будут работать с GWT. HttpClient и связанные с ним классы записываются для работы в JVM с полной поддержкой для открытия сокетов, что не допускается в веб-браузере, поэтому эти классы не могут использоваться.
Чтобы открыть соединение с сервером, который вы используете (в соответствии с политикой одинакового исходного кода браузера), рассмотрите класс RequestBuilder, который позволяет вам указать URL-адрес и метод HTTP, а также заголовки, параметры, данные и т.д. Этот класс является абстракцией над объектом XmlHttpRequest в JavaScript, обычно используемым для запросов AJAX в простой JS.
Ответ 2
Если вы используете Maven, вы можете это сделать.
maven-gwt-plugin с параметром compileSourcesArtifacts будет работать со всеми источниками и будет позволять вы должны скомпилировать модуль GWT.
В модуле, который вы хотите включить, вы должны включить генерацию исходного пакета. Посмотрите пример внешнего модуля GWT на Github.
GWT не может скомпилировать Java-код для кода клиента JavaScript. Он поддерживает только несколько базовых классов. См. Справочник по эмуляции GWT JRE.
Пример pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<dependencies>
<dependency>
<groupId>com.my.group</groupId>
<artifactId>my-artifact</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<!-- ... -->
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>2.5.0</version>
<!-- ... -->
<configuration>
<compileSourcesArtifacts>
<compileSourcesArtifact>com.my.group:my-artifact</compileSourcesArtifact>
</compileSourcesArtifacts>
</configuration>
</plugin>
</plugins>
</build>
</project>
Ответ 3
Вы должны наследовать в свой *.gwt.xml необходимый модуль (ы).
Нравится: <inherits name="module_name"/>
Ответ 4
Вы не можете использовать классы, которые не эмулируются GWT в коде на стороне клиента, если вы не предоставите исходный код (это невозможно в вашем случае, когда вы пытаетесь использовать стороннюю библиотеку).
Список всех эмулируемых классов JRE: http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html
Прочтите эту исчерпывающую документацию о выполнении запросов на межсайтовый сайт в GWT: http://code.google.com/webtoolkit/doc/latest/tutorial/Xsite.html
Ответ 5
Исходный код клиента может ссылаться на исходный код сервера. Просто попробуйте поместить исходный код сервера в общий пакет.
Ответ 6
Когда я получаю "исходный код недоступен..." в диалоговом окне Chrome при загрузке приложения GWT вместе с приведенными выше ответами, я обнаружил две другие причины:
-
Это означает, что мой код сервера относится к коду, который не находится в общих или серверных пакетах. (Компилятор не жалуется, но GWT делает. К сожалению, сообщение об ошибке НЕ полезно.)
-
Я забыл предоставить конструктор без параметров для класса, который я передаю от клиента к серверу. (I.e. Я написал собственный конструктор WITH с параметром, поэтому конструктор по умолчанию отсутствует.) GWT-RPC сериализует этот класс в фоновом режиме, а для десериализации требуется конструктор без параметров. Так что проблема, и снова, сообщение об ошибке бесполезно и вводит в заблуждение.