2017-05-08 7 views
0

Gibt es eine Unterstützung für die Verwendung abstrakter Befehlsobjekte in Controller-Aktionsparameter? Dann würde es abhängig von den gegebenen Parametern in einer JSON-Anfrage das richtige Befehlsobjekt auswählen?Grails Controller Aktion Zusammenfassung Befehl Objekt Parameter

Zum Beispiel so etwas wie:

class SomeController { 

    def someAction(BaseCommand cmd){ 
     // cmd could be instance of ChildCommandOne or ChildCommandTwo 
    } 

    class BaseCommand { 
     String paramOne 
    } 

    class ChildCommandOne extends BaseCommand { 
     String paramTwo 
    } 

    class ChildCommandTwo extends BaseCommand { 
     String paramThree 
    } 

} 

Ab jetzt habe ich request.JSON wurde unter Verwendung der übergebenen Parameter und instanziiert das richtige Objekt Command zu erkennen. Ist das meine einzige Möglichkeit, mit dieser Art von Fällen umzugehen?

EDIT:

Um den Anwendungsfall hier zu klären. Ich habe zwei Domänenmodelle mit demselben Basisklassen-Domänenmodell und modelliere die Vererbung in der Datenbank mit dem Standardmodell table-per-hierarchy.

In meinem Fall eine der untergeordneten Domäne Modelle Model A erfordert ein Nicht-Nullable-String body genannt, dass eine Texteingabe ist, während die anderen Model B ein Nicht-Nullable-String directUrl genannt erfordert. Dies sind Ankündigungen, die auf der Plattform gemacht werden können. Model A ist ein Eintrag, der den Ankündigungshauptteil enthält, während Model B einen Link zu einer Website von Drittanbietern darstellt, der die eigentliche Ankündigung enthält.

In diesen Szenarien habe ich traditionell eine if-Anweisung in der Controller-Aktion gesetzt, die bestimmt, welches verwandte Befehlsobjekt instanziiert wird, aber ich hoffe auf eine sauberere Methode.

+1

Nun, ich denke nicht, es ist ein guter Ansatz, wenn Sie 3 verschiedene Befehle haben, warum erstellen Sie nicht 3 verschiedene Aktionen? Vielleicht wäre es einfacher, wenn Sie Ihren Anwendungsfall erklären würden – rgrebski

+0

@rgrebski Ich habe die Frage aktualisiert, um meinen tatsächlichen Anwendungsfall zu enthalten. Wie kann ich zusätzlich zwischen den 3 Aktionen unterscheiden, ohne in meinen URL-Zuordnungen separate Endpunkte deklarieren zu müssen? – dvisco

Antwort

0

Es wird nicht so funktionieren. Grails benötigt eine konkrete Klasse (mit einem öffentlichen Standardkonstruktor) für bind, um Parameter für eine Befehlsobjektinstanz anzufordern. Daher ist diese Klasse explizit als Argument der Aktion zu definieren.

+0

Also traditionell wie würde jemand mit diesem Fall umgehen? Verwenden Sie separate Endpunkte, um zwischen den verschiedenen Befehlen zu unterscheiden? – dvisco

+0

rufen Sie 'bindData()' für eine bestimmte Instanz selbst auf. es ist einfach – injecteer

0

Ich denke, Sie müssen Bindung manuell aufrufen abhängig davon, welche Karte enthält.
Siehe RootModel.from (Map map). In Ihrem Fall Karte wäre von Controller

+0

Dies ist ein interessanter Ansatz. Um davon abzulenken, könnte ich die gültigen Domänenbefehlsobjekte annotieren und eine Diskriminatorannotation haben, die die Eigenschaft kennzeichnet, die sie zwischen den anderen Befehlen unterscheidet. Testen Sie dann, bis ich das erste Befehlsobjekt mit einer übereinstimmenden Diskriminatoreigenschaft in der Parameterzuordnung gefunden habe. – dvisco

Verwandte Themen