Noob Total de gwt/gson dans eclipse, erreur: “Impossible d'invoquer aucun des arguments du constructeur pour la classe”
Je suis en train de jouer avec cela, Google Web toolkit/GSON exemple qui récupère les données à partir de twitter.
Tout ce qui est en train de compiler juste bien, mais quand je debug de l'Application Web, tout se charge bien, mais lorsque je clique sur le bouton "rechercher", j'obtiens l'erreur suivante:
SÉVÈRE: javax.servlet.ServletContext journal: Exception lors de dispatching entrant appel RPC
com.google.gwt.de l'utilisateur.serveur.rpc.UnexpectedException: méthode de Service public abstraite java.util.Liste com.google.gwt.twittersearch.client.TwitterService.searchTweets(java.lang.Chaîne de caractères) throws java.io.IOException,java.lang.IllegalArgumentException' a généré une exception inattendue: java.lang.RuntimeException: Impossible d'invoquer aucun des arguments du constructeur pour la classe com.google.gwt.twittersearch.serveur.TwitterServiceImpl$SearchResponse. Enregistrer un InstanceCreator avec Gson pour ce type peut résoudre ce problème.
au com.google.gwt.de l'utilisateur.serveur.rpc.RPC.encodeResponseForFailure(RPC.java:385)
au com.google.gwt.de l'utilisateur.serveur.rpc.RPC.invokeAndEncodeResponse(RPC.java:588)
au com.google.gwt.de l'utilisateur.serveur.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
au com.google.gwt.de l'utilisateur.serveur.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
au com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
au javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
au javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
au org.mortbay.la jetée.servlet.ServletHolder.la poignée(ServletHolder.java:511)
au org.mortbay.la jetée.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
au com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
au org.mortbay.la jetée.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
au com.google.appengine.l'api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
au org.mortbay.la jetée.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
au com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
au org.mortbay.la jetée.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
au com.google.appengine.outils.développement.StaticFileFilter.doFilter(StaticFileFilter.java:125)
au org.mortbay.la jetée.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
au com.google.appengine.outils.développement.BackendServersFilter.doFilter(BackendServersFilter.java:97)
au org.mortbay.la jetée.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
au org.mortbay.la jetée.servlet.ServletHandler.la poignée(ServletHandler.java:388)
au org.mortbay.la jetée.de sécurité.SecurityHandler.la poignée(SecurityHandler.java:216)
au org.mortbay.la jetée.servlet.SessionHandler.la poignée(SessionHandler.java:182)
au org.mortbay.la jetée.gestionnaire d'.ContextHandler.la poignée(ContextHandler.java:765)
au org.mortbay.la jetée.webapp.WebAppContext.la poignée(WebAppContext.java:418)
au com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
au org.mortbay.la jetée.gestionnaire d'.HandlerWrapper.la poignée(HandlerWrapper.java:152)
au com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:370)
au org.mortbay.la jetée.gestionnaire d'.HandlerWrapper.la poignée(HandlerWrapper.java:152)
au org.mortbay.la jetée.Serveur.la poignée(Serveur de.java:326)
au org.mortbay.la jetée.HttpConnection.handleRequest(HttpConnection.java:542)
au org.mortbay.la jetée.HttpConnection$RequestHandler.contenu(HttpConnection.java:938)
au org.mortbay.la jetée.HttpParser.parseNext(HttpParser.java:755)
au org.mortbay.la jetée.HttpParser.parseAvailable(HttpParser.java:218)
au org.mortbay.la jetée.HttpConnection.la poignée(HttpConnection.java:404)
au org.mortbay.io.nio.SelectChannelEndPoint.exécuter(SelectChannelEndPoint.java:409)
au org.mortbay.fil de discussion.QueuedThreadPool$PoolThread.exécuter(QueuedThreadPool.java:582)
Causés par: java.lang.RuntimeException: Impossible d'invoquer aucun des arguments du constructeur pour la classe com.google.gwt.twittersearch.serveur.TwitterServiceImpl$SearchResponse. Enregistrer un InstanceCreator avec Gson pour ce type peut résoudre ce problème.
au com.google.gson.interne.ConstructorConstructor$8.construire(ConstructorConstructor.java:167)
au com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
au com.google.gson.Gson.fromJson(Gson.java:795)
au com.google.gson.Gson.fromJson(Gson.java:734)
au com.google.gwt.twittersearch.server.TwitterServiceImpl.parseSearchResponse(TwitterServiceImpl.java:80)
au com.google.gwt.twittersearch.serveur.TwitterServiceImpl.searchTweets(TwitterServiceImpl.java:35)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke0(Native method)
au coucher du soleil.de réfléchir.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
au coucher du soleil.de réfléchir.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:597)
au com.google.appengine.outils.développement.de l'agent.moment de l'exécution.Moment de l'exécution.invoke(Runtime.java:115)
au com.google.gwt.de l'utilisateur.serveur.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
34 de plus ...
Causés par: java.lang.UnsupportedOperationException: Ne peut allouer de la classe com.google.gwt.twittersearch.serveur.TwitterServiceImpl$SearchResponse
au com.google.gson.interne.UnsafeAllocator$4.newInstance(UnsafeAllocator.java:100)
au com.google.gson.interne.ConstructorConstructor$8.construire(ConstructorConstructor.java:164)
... 45 plus
Ici est la TwitterServiceImpl code:
package com.google.gwt.twittersearch.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
import com.google.gwt.twittersearch.client.Tweet;
import com.google.gwt.twittersearch.client.TwitterService;
import com.google.gson.Gson;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@SuppressWarnings("serial")
public class TwitterServiceImpl extends RemoteServiceServlet implements
TwitterService {
@Override
public List<Tweet> searchTweets(String query) throws IllegalArgumentException, IOException {
query = query.trim();
if (query.isEmpty()) {
throw new IllegalArgumentException("No search query specified.");
}
//see: https://dev.twitter.com/docs/api/1/get/search
String q = URLEncoder.encode(query, "UTF-8");
URL url = new URL("http://search.twitter.com/search.json?q=" + q);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream response = null;
try {
response = connection.getInputStream();
return parseSearchResponse(response);
} finally {
if (response != null) {
response.close();
}
}
}
@Override
public String getPrivacyPolicy() throws IOException {
//see: https://dev.twitter.com/docs/api/1/get/legal/privacy
URL url = new URL("https://api.twitter.com/1/legal/privacy.json");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream response = null;
try {
response = connection.getInputStream();
return parsePolicyResponse(response);
} finally {
if (response != null) {
response.close();
}
}
}
/**
* Parses the privacy policy response returned from the Twitter API.
* @param response the response
* @return the privacy policy
* @throws IOException if there was a problem reading the response
*/
private String parsePolicyResponse(InputStream response) throws IOException {
Reader reader = new InputStreamReader(response);
PrivacyPolicyResponse privacyPolicyResponse = new Gson().fromJson(reader, PrivacyPolicyResponse.class);
return privacyPolicyResponse.privacy;
}
/**
* Parses the search response returned from the Twitter API.
* @param response the response
* @return the search results
* @throws IOException if there was a problem reading the response
*/
private List<Tweet> parseSearchResponse(InputStream response) throws IOException {
Reader reader = new InputStreamReader(response);
SearchResponse searchResponse = new Gson().fromJson(reader, SearchResponse.class);
return searchResponse.results;
}
private class PrivacyPolicyResponse {
public String privacy;
}
private class SearchResponse {
public List<Tweet> results;
}
}
Ici est le point d'entrée de code:
package com.google.gwt.twittersearch.client;
import java.util.List;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class TwitterSearch implements EntryPoint {
private Button privacyPolicyButton;
private Button searchButton;
private TextBox searchQueryTextBox;
private Panel resultsPanel;
private Label errorLabel;
private Image loadingImage;
private final TwitterServiceAsync service = GWT.create(TwitterService.class);
/**
* This is the entry point method.
*/
public void onModuleLoad() {
createWidgets();
layoutWidgets();
}
private void createWidgets() {
searchQueryTextBox = new TextBox();
searchButton = new Button("Search");
searchButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setLoading(true);
String query = searchQueryTextBox.getText();
service.searchTweets(query, new AsyncCallback<List<Tweet>>() {
@Override
public void onFailure(Throwable caught) {
errorLabel.setText(caught.getMessage());
errorLabel.setVisible(true);
setLoading(false);
}
@Override
public void onSuccess(List<Tweet> result) {
resultsPanel.clear();
for (Tweet tweet : result) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.appendHtmlConstant("<b>User: </b>");
builder.appendEscaped(tweet.getFrom_user());
builder.appendHtmlConstant("<br /><b>Created: </b>");
builder.appendEscaped(tweet.getCreated_at());
builder.appendHtmlConstant("<br /><b>Tweet: </b>");
builder.appendEscaped(tweet.getText());
builder.appendHtmlConstant("<br /><br />");
resultsPanel.add(new HTML(builder.toSafeHtml()));
}
setLoading(false);
}
});
}
});
privacyPolicyButton = new Button("Privacy Policy");
privacyPolicyButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setLoading(true);
service.getPrivacyPolicy(new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
errorLabel.setText(caught.getMessage());
errorLabel.setVisible(true);
setLoading(false);
}
@Override
public void onSuccess(String result) {
resultsPanel.clear();
//convert newlines to <br />
SafeHtmlBuilder builder = new SafeHtmlBuilder();
builder.appendEscapedLines(result);
resultsPanel.add(new HTML(builder.toSafeHtml()));
setLoading(false);
}
});
}
});
resultsPanel = new VerticalPanel();
errorLabel = new Label();
errorLabel.addStyleName("errorLabel");
errorLabel.setVisible(false);
//image from http://loadinfo.net/
loadingImage = new Image("loading.gif");
loadingImage.setVisible(false);
}
private void layoutWidgets() {
Panel panel = new VerticalPanel();
panel.add(errorLabel);
Panel horizPanel = new HorizontalPanel();
horizPanel.add(searchQueryTextBox);
horizPanel.add(searchButton);
horizPanel.add(privacyPolicyButton);
horizPanel.add(loadingImage);
panel.add(horizPanel);
panel.add(resultsPanel);
RootPanel.get().add(panel);
}
/**
* Updates the UI for when a RPC call is made.
* @param loading true if an RPC call is being sent, false if not
*/
private void setLoading(boolean loading) {
if (loading) {
errorLabel.setVisible(false);
}
searchQueryTextBox.setEnabled(!loading);
searchButton.setEnabled(!loading);
privacyPolicyButton.setEnabled(!loading);
loadingImage.setVisible(loading);
}
}
Voici le tweet de code:
package com.google.gwt.twittersearch.client;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Tweet implements Serializable{
private String id;
private String from_user;
private String created_at;
private String text;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFrom_user() {
return from_user;
}
public void setFrom_user(String from_user) {
this.from_user = from_user;
}
public String getCreated_at() {
return created_at;
}
public void setCreated_at(String created_at) {
this.created_at = created_at;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Tout un aperçu de cette erreur ou où je pourrais aller à partir d'ici serait grandement apprécié!
Merci, brl
OriginalL'auteur brl8 | 2012-08-27
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'ajouter un no-args constructeur telles que:
MODIFIER
Vous aurez également besoin d'un ici aussi
pour faire face à votre erreur
java.lang.RuntimeException: Unable to invoke no-args constructor for class
Une classe définie par l'utilisateur est sérialisable si:
la classe est assignable à IsSerializable ou java.io.Serializable, soit parce qu'elle met en œuvre l'une de ces interfaces, ou parce qu'il est dérivé d'une super-classe qui implémente l'une de ces interfaces.
tous les de la classe non-finale, non transitoire des champs d'instance sont sérialisables
la classe a un public par défaut (zéro argument) constructeur
ci-dessus est à partir de ce tutoriel
public class Tweet implements Serializable{ private String id; private String from_user; private String created_at; private String text; /** public Tweet(String twit_id, String twit_user, String twit_created, String twit_text){ * id = twit_id; * from_user = twit_user; * created_at = twit_created; * text = twit_text; } */ public Tweet() { } public String getId() { return id; }
et j'ai aussi essayé avec le commentée de la partie sans commentairevoir mon édité commentaires. Vous avez également besoin d'un no-args constructeur de SearchResponse.
OriginalL'auteur user1258245