2012-12-10 4 views
1

J'ai compris que mes problèmes avec le système GSON tenaient au fait que, bien que mon type de retour ne soit pas un objet paramétré, il aurait dû l'être. Maintenant, j'ai besoin d'utiliser la méthode Gson.fromJson avec le type de paramètre pour spécifier le type de retour afin que GSON s'en charge pour moi.Créer un type paramétré de type "Classe"

J'ai créé une classe générique appelé RestResponse tel:

public class RestResponse<T> { 
    private String  errorMessage; 
    private int   errorReason; 
    private T   result; 

    /* (non-Javadoc) 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
    return "RestResponse [errorMessage=" + errorMessage + ", result=" + result + "]"; 
    } 

    /** 
    * Does this response contain an error? 
    * @return true if in error 
    */ 
    public boolean isInError(){ 
    return getErrorMessage()!=null; 
    } 

    /** 
    * @return the errorMessage 
    */ 
    public String getErrorMessage() { 
    return errorMessage; 
    } 

    /** 
    * @param errorMessage the errorMessage to set 
    */ 
    public void setErrorMessage(String errorMessage) { 
    this.errorMessage = errorMessage; 
    } 

    /** 
    * The error reason code 
    * @return the errorReason 
    */ 
    public int getErrorReason() { 
    return errorReason; 
    } 

    /** 
    * The error reason code 
    * @param errorReason the errorReason to set 
    */ 
    public void setErrorReason(int errorReason) { 
    this.errorReason = errorReason; 
    } 

    /** 
    * The result of the method call 
    * @return the result or null if nothing was returned 
    */ 
    public final T getResult() { 
    return result; 
    } 

    /** 
    * The result of the method call 
    * @param result the result to set or null if nothing was returned 
    */ 
    public final void setResult(T result) { 
    this.result = result; 
    } 
} 

Maintenant, je veux créer le type résultant de l'autre côté. J'ai une méthode générique que j'utilise pour décoder ces choses et soit jeter l'exception ou retourner le résultat.

donc ma méthode est comme ceci:

public Object submitUrl(String url, Class<?> clazz) throws AjApiException { 

Où clazz est le type qui sera spécifié sur RestResponse.

Je vais ensuite créer le RestResponse avant de passer à GSON:

Type typeOfT = new TypeToken<RestResponse<clazz>>(){}.getType(); //1-->What goes here? 
RestResponse<clazz> restResponse; //2-->and here? 

Et il des erreurs. Quelqu'un peut-il me dire ce qui se passe dans ces endroits à la place de clazz?

Répondre

0

J'ai fini par passer le type au lieu de la classe. Cela a résolu le problème.

Je crois que vous pouvez créer le type en faisant quelque chose comme:

Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType(); 
+0

Pourriez-vous fournir plus d'informations sur la façon dont vous l'avez implémenté? Merci! –

+0

@BenoitDuffez J'ai ajouté du code qui, je pense, va aider. Ça fait un moment, donc je ne suis pas sûr de sa syntaxe. S'il vous plaît upvote si utile. – Thom

+0

OK merci beaucoup. Ce n'est pas la solution que je voulais, mais ça peut être utile à quelqu'un.En outre, le '' est inutile ici à cause de l'effacement de type. La seule façon dont j'ai trouvé comment décrire les génériques à Gson était à travers 'ParameterizedType'. Voir http://stackoverflow.com/a/14139700/334493 –

1

Au lieu de transmettre la classe que vous souhaitez inclure dans la réponse, spécifiez-la comme un paramètre générique de niveau méthode.

public <T> T submitUrl(String url) throws AjApiException { 
    Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType(); 
} 
+0

Vous ne voulez pas faire cela parce que je veux avoir une instance qui maintient les cookies, etc. Cela nécessiterait de nouvelles instances pour chaque méthode En l'utilisant. – Thom

+0

Qu'est-ce que la maintenance des cookies a à voir avec la désérialisation de JSON? Cette méthode résout le problème que vous aviez en spécifiant la classe cible, sans imposer de restrictions supplémentaires. Vous pourriez vouloir clarifier ce que vous essayez de faire exactement. – Perception

+0

Non, 'typeOfT' représenterait le type' RestResponse '. Oui, littéralement "T", peu importe sa classe. – newacct

-1

La façon la plus simple serait de l'appelant de la méthode, au lieu de passer dans un objet Class, pour passer dans un Type correspondant à la RestResponse<Whatever>; ils le feraient probablement en utilisant la chose TypeToken.

Sinon, il vous est possible de construire le Type (plus précisément un ParameterizedType). Vous devez soit créer votre propre classe qui implémente ParameterizedType, soit copier la classe privée ParameterizedTypeImpl utilisée dans certains projets.

Questions connexes