2017-02-07 4 views
0

Ist es möglich, dynamisch ein GraphQL-Schema erstellen?Dynamic generiert GraphQL Schema unterstützt

Wir speichern die Daten in mongoDB und es besteht die Möglichkeit, dass neue Felder hinzugefügt werden. Wir möchten, dass für dieses neu hinzugefügte Feld im mongoDB-Dokument keine Codeänderung stattfindet.

Gibt es eine Möglichkeit, das Schema dynamisch zu generieren?

Schema wird in Code definiert, aber für Java (Schema als pojo), wenn neue Attribut hinzugefügt wird, müssen Sie aktualisieren und Code neu kompilieren, dann Archiv und das Glas wieder einzusetzen. Irgendeine Möglichkeit, Schema durch die Daten zu generieren, anstatt es vordefinieren?

Aktuell sind wir java Projekte (graphql-java, graphql-java-annotations) für GraphQL Entwicklung mit.

Antwort

0

Nach einigen Tagen Untersuchung. Ich fand es schwierig, ein Schema dynamisch in Java zu generieren (oder die Kosten sind so hoch).

Nun, von einem anderen Weg. Ich denke, wir können Map als einen kompromittierten Weg verwenden, um das zu erreichen.

  • POJO/Entity

    public class POJO{ 
        @GraphQLField 
        private Long id; 
    
        @GraphQLField 
        private String name; 
    
        // ... 
    
        @GraphQLField 
        private GMap exts; 
    } 
    

    GMap ist eine maßgeschneiderte Karte (Da Karte/HashMap ist eine JDK innere Klasse, die nicht als GraphQL Schema machen könnte, sondern nur verlängern).

  • GMap

    public class GMap extends HashMap<String, String> { 
    
        @GraphQLField 
        public String get(@GraphQLName("key") String key) { 
         return super.get(key); 
        } 
    } 
    
  • Daten abrufen von Client-

    // query script 
    query test 
    { 
        your_method 
        { 
         id 
         name 
         exts { 
          get(key: "ext") // Add a extended attribute someday 
         } 
        } 
    } 
    
    // result 
    { 
        "errors":[], 
        "data": 
        { 
         "list": 
         [ 
          {"id":1, name: "name1", exts: {"get": "ext1"}}, 
          {"id":2, name: "name2", exts: {"get": "ext2"}} 
         ] 
        } 
    } 
    
1

Sie graphql-spqr verwenden könnte, erlaubt es Ihnen automatisch generieren ein Schema basierend auf Ihren Service-Klassen. In Ihrem Fall würde es so aussehen:

public class Pojo { 

    private Long id; 
    private String name; 

    // whatever Ext is, any (complex) object would work fine 
    private List<Ext> exts; 
} 

public class Ext { 
    public String something; 
    public String somethingElse; 
} 

Vermutlich haben Sie eine Serviceklasse Ihre Business-Logik enthalten:

public class PojoService { 

    //this could also return List<Pojo> or whatever is applicable 
    @GraphQLQuery(name = "pojo") 
    public Pojo getPojo() {...} 
} 

diesen Dienst zu exponieren, würden Sie tun gerade folgendes:

GraphQLSchema schema = new GraphQLSchemaGenerator() 
                .withOperationsFromSingleton(new PojoService()) 
                .generate(); 

Sie könnten dann eine Abfrage Feuer wie:

query test { 
    pojo { 
     id 
     name 
     exts { 
      something 
      somethingElse 
     } } } 

Keine seltsamen Wrapper oder benutzerdefinierten Code jeglicher Art, noch Opfer Typ Sicherheit. Funktioniert mit Generika, Abhängigkeitsinjektionen oder jedem anderen Jazz, den Sie in Ihrem Projekt haben.

Volle Offenbarung: Ich bin der Autor von graphql-spqr.

Verwandte Themen