web-dev-qa-db-fra.com

Aucun code source n'est disponible pour le type: Erreur de compilation GWT

J'essaie de faire des demandes get par un servlet dans mon application GWT. En compilant le code, je reçois ces erreurs.

[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?

Que dois-je faire pour supprimer ces erreurs? Ces classes ne sont-elles pas prises en charge par GWT?

Voici le code que j'utilise

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");
}

Ce code fonctionne bien si je l’utilise sur une application projet/console Java habituelle.

16
Saurabh Saxena

Le code Java exécuté dans GWT est traduit en Javascript. Par conséquent, certaines classes fonctionnant sur une machine virtuelle Java ne fonctionnent pas avec GWT. HttpClient et les classes associées sont écrits pour fonctionner sur une machine virtuelle Java avec prise en charge complète de l'ouverture de sockets, ce qui n'est pas autorisé dans un navigateur Web. Ces classes ne peuvent donc pas être utilisées.

Pour ouvrir une connexion au serveur que vous utilisez (en fonction de la politique d'origine du navigateur), considérez la classe RequestBuilder, qui vous permet de fournir une URL et une méthode HTTP, ainsi que des en-têtes, des paramètres, des données, etc. Cette classe est une abstraction sur l'objet XmlHttpRequest en JavaScript, couramment utilisée pour les demandes AJAX en clair JS.

9
Colin Alworth

Si vous utilisez Maven, vous pouvez le faire.

maven-gwt-plugin avec le paramètre compileSourcesArtifacts fera tout le travail de gestion des sources et vous permettra de compiler le module GWT.

Dans le module que vous souhaitez inclure, vous devrez activer la génération du paquet source . Et jetez un oeil à exemple de module externe GWT sur Github .

GWT ne peut compiler aucune classe Java en code client JavaScript. Il ne prend en charge que plusieurs classes de base. Voir Référence d'émulation GWT JRE .

Exemple 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>
13

Vous devez hériter de vos modules * .gwt.xml needed.

J'aime: <inherits name="module_name"/>

10
ArtemStorozhuk

Vous ne pouvez pas utiliser de classes qui ne sont pas émulées par GWT dans le code côté client, sauf si vous fournissez du code source (impossible dans votre cas car vous essayez d'utiliser une bibliothèque tierce).

Liste de toutes les classes JRE émulées: http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html

Lisez cette documentation complète sur les requêtes intersite dans GWT: http://code.google.com/webtoolkit/doc/latest/tutorial/Xsite.html

3
Strelok

Votre code source du client peut faire référence à un code source du serveur. Essayez simplement de placer le code source de votre serveur dans un package partagé.

1
user4875699

J'ai eu ce problème. Cela était dû au fait que les interfaces RemoteService n'étaient pas incluses dans le package "Client" uniquement dans le package du projet.

0
user2258777

Lorsque j'obtiens "aucun code source n'est disponible ..." dans une boîte de dialogue de Chrome lors du chargement d'une application GWT, avec les réponses ci-dessus, j'ai trouvé deux autres causes:

  1. Cela signifie que le code de mon serveur fait référence à du code qui ne se trouve pas dans les packages partagés ou serveur. (Le compilateur ne se plaint pas, mais GWT le fait. Malheureusement, le message d'erreur n'est PAS utile.)

  2. J'ai oublié de fournir un constructeur sans paramètre pour une classe que je passe de client à serveur. (C'est-à-dire que j'ai écrit mon propre constructeur AVEC un paramètre, il n'y a donc pas de constructeur par défaut.) GWT-RPC est en train de sérialiser cette classe en arrière-plan et la désérialisation nécessite un constructeur sans paramètre. Voilà donc le problème, et encore une fois, le message d'erreur est inutile et trompeur.

0
i2B