2017-07-18 5 views
2

J'utilise Google GSON dans mon application Java. Imaginez la situation suivante: Un nouvel attribut JSON a été ajouté dans la version 1.2.1. Comment puis-je l'utiliser dans l'annotation @Since? Évidemment, @Since(1.2.1) n'est pas possible car 1.2.1 n'est pas un double valide. Le format de ma version est <major>.<minor>.<patch>.Google GSON: Comment utiliser l'annotation @Since pour, par exemple, version "1.2.1"? (double invalide)

Une autre chose que j'ai remarqué si j'ai la version 1.20, GSON le voit comme une version inférieure à celle par exemple la version 1.3.

Des idées pour résoudre ce problème? Pourrait peut-être quelque chose comme un exclu personnalisé fonctionne? (existe-t-il même?)

En plus du problème de version, j'ai remarqué que l'annotation @Since peut aussi être utilisée pour les classes. Je n'ai trouvé aucune documentation à ce sujet. J'apprécierais que quelqu'un puisse expliquer pourquoi cela est utile.

Répondre

1

Il semble que l'annotation @Since soit un peu limitée et ne fonctionne pas pour vous. Vous avez raison d'avoir besoin d'une stratégie d'exclusion personnalisée. Quelque chose comme ci-dessous fonctionne:

  1. Créez votre propre annotation pour les versions à utiliser au lieu de @Since:

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ElementType.FIELD, ElementType.TYPE}) 
    @interface VersionAnnotation { 
        String versionNumber(); 
    } 
    
  2. stratégie d'exclusion personnalisée:

    class VersionExclusionStrategy implements ExclusionStrategy { 
    
        private String versionNumber; 
    
        VersionExclusionStrategy(String versionNumber) { 
         this.versionNumber = versionNumber; 
        } 
    
        @Override 
        public boolean shouldSkipClass(Class<?> classType) { 
         VersionAnnotation va = classType.getAnnotation(VersionAnnotation.class); 
    
         return va != null && versionCompare(this.versionNumber, va.versionNumber()) < 0; 
        } 
    
        @Override 
        public boolean shouldSkipField(FieldAttributes fieldAttributes) { 
         VersionAnnotation va = fieldAttributes.getAnnotation(VersionAnnotation.class); 
    
         return va != null && versionCompare(this.versionNumber, va.versionNumber()) < 0; 
        } 
    
        private static int versionCompare(String str1, String str2) { 
         // TODO implement 
        } 
    } 
    
  3. La méthode versionCompare est ce que va comparer vos chaînes de version. Je l'une d'une réponse à cette question: How do you compare two version Strings in Java?

  4. Utilisation:

    Gson gson = new GsonBuilder().setExclusionStrategies(new VersionExclusionStrategy("1.3")).create(); 
    

Je ne sais pas comment cela serait utile pour les classes. Vous pouvez annoter la classe pour ne pas avoir à annoter toutes les références de classe dans les autres classes, mais c'est à peu près tout.

+1

Merci, je l'ai fonctionné. J'ai déjà réalisé que l'annotation '@ Since 'par défaut n'aurait pas fonctionné, c'est trop limité. L'annotation pour une classe est en fait très pratique. Si une nouvelle "fonctionnalité" est introduite dans une nouvelle version de l'API, je peux simplement annoter la classe au lieu de chaque nouveau champ. C'est beaucoup plus lisible de cette façon. –