Hast du ein Bier im Schell? Ja, ja. Okay. Ja,
würde ich sagen, fangen wir mal an, oder?
Irgendwie. Genau. Ja, willkommen zum Grails-Stammtisch. Ja,
dieses Mal, das ist, glaube ich, jetzt das,
keine Ahnung, vierte oder fünfte Mal, dass wir das veranstalten.
Diesmal haben wir etwas größere Runde als sonst.
Freut mich natürlich. Ja, ich sage mal so,
eingangs würde ich ganz gerne so eine kleine Umfrage bei euch mal starten.
Wie euer Wissenstand ist, also wie viel Anu ihr
von Grails habt, weil davon hängt ein bisschen ab,
wie ich das hier erzähle.
Ich frage einfach mal, wer hat denn überhaupt
gar keine Ahnung,
was Grails überhaupt ist
Ja, ja. Alter. Ah, ja.
Ja, aber auf dich wird keine Rücksicht, genau.
Okay, also so eine Grundidee ist bei allen vorhanden.
Dann würde ich die Einleitung ein bisschen kürzer machen.
Ja, aber es ist gemächtestes Bestsellblock, das war's.
Okay. Also sprich nichts, aber nah dran.
Okay. Sehr gut, dann erzähle ich kurz ein bisschen was,
worum es geht. Also hier, mein Vortrag geht um,
ja, Restservices im Bereich Mobile, so ein bisschen...
Kann man die Musik vorher ausmachen
Ja. Bitte? Die Musik ausmachen irgendwie. Ja, super.
Ich höre das gar nicht. Ich auch nicht, aber gut.
Ja, das tut es irgendwie nicht so ganz, ne?
Ja. Ja, gut. Ich muss ein bisschen lauter reden.
Kai, ja gut. Genau, also wie gesagt,
in dem Vortrag geht es um Restservices oder wie man
ganz grundsätzlich mobile Geräte mit Grails an einen Server anbindet,
kommeditionieren lässt.
Wir haben so ein bisschen herumexploriert, wie man das effizient machen kann.
Ich selber bin von der Firma Infinite.
Wir veranstalten ja hier
den Grails-Stammtisch
Immer in Softwareentwicklung, Projektmanagement, Schulung,
in dem ganzen Umfeld, technologisch. Ja,
und ich würde sagen, wir fangen einfach mal an,
so ein bisschen zu erzählen, worum geht es überhaupt?
Also was eingeflossen ist in den Vortrag, ist die Erfahrung,
die wir aus verschiedenen Projekten gesammelt haben im Bereich iOS und Android,
also wie man diese Geräte anbindet, an Server.
Da empfiehlt es sich eigentlich,
dass über eine Restschnittstelle zu machen,
beziehungsweise über die Schnittstelle dann Jason
sehralisierte Daten zu schicken
Einfach zum einen, weil Jason sehr viel kleiner ist
als sowas wie XML. Das verbietet sich eigentlich schon.
Und für iOS-Geräte ist es auch so,
dass der XML-Paser relativ ineffizient ist und auch noch Energie frisst.
Super, vielen Dank. Sehr viel schärfer, ja.
Auf der anderen Seite ist es auch so,
wenn man das jetzt mal vergleicht mit Soap-Services oder Remote-Speens aus dem Java-A-Umfeld,
ist Resthalten sehr viel schwacherer Vertrag.
Also im Sinne von Contract
Und typischerweise ist es so, dass man,
wenn man eine App entwickelt, auch die Schnittstelle langsam mitwächst.
Es kommen dann mehrere Features dazu, zusätzliche Funktionen.
Parameter kommen hinzu, Rückgabewerte kommen hinzu.
Und das Schöne bei dieser Restschnittstelle ist im Allgemeinen,
die alten Apps, die können dann trotzdem weiterlaufen.
Egal, ob da noch ein Postparameter mehr oder weniger dabei ist.
Das funktioniert dann irgendwie trotzdem. Und wenn man das mit Soap macht,
funktioniert das halt eben nicht. Das ist mit einer der Vorteile,
die wir gesehen haben bei der Restschnittstelle. So,
auf der anderen Seite,
also Rest verwenden wir hauptsächlich dann vom Server zum Gerät in die andere Richtung,
gibt es einen ganz normalen Post von Parametern,
der aber auf dem Server dann auch validiert werden muss.
Und ja, auch da will ich gleich ein bisschen was zu zeigen,
wie man das halt effizient und relativ strukturiert auch mit Grails hinbekommt.
Ja, was dann einer der Hauptmotivationstreiber ist,
also wenn man jetzt mal so ein Java-EE-Projekt vergleicht mit sowas wie Grails,
dann muss man halt sehen, dass so Mobilprojekte typischerweise viel,
viel kleiner sind.
Also man kann jetzt hier nicht so ein,
was weiß ich, jahrelang ausgelegtes Mobile-App-Projekt,
gibt es eigentlich
eher weniger
Und das heißt, man muss eigentlich Gräels dahingehend auf den Prüfstand stellen,
ob es halt, ja, in relativ kurzer Zeit möglich ist,
effizient so eine Schnittstelle aufzusetzen. Wie schon eingangs gesagt,
wollte ich erst mal ganz kurz dann mal darauf eingehen,
was Gräels überhaupt ist, wie das ungefähr aufgebaut ist.
Ja, ganz unten sieht man ja hier,
Jabba Virtual Machine, ganz am Ende ist Grails,
basiert es auf Java, läuft auch auf Java-Infrastruktur,
also diese typischen, was weiß ich, Volkswagen,
wie die ganzen Konzerne alle heißen,
die haben meistens halt irgendwelche Application-Server,
wo man das auch
drin laufen lassen kann
Da drauf ist dann von Grace Groovie gesetzt, also was,
ja, Goovies, man kann nicht sagen Weiterentwicklung,
es ist eigentlich eine Verbesserung von Java,
wo verschiedene Ausdrücke sehr viel einfacher zu formulieren sind.
Das ist das Fundament, das sprachliche Fundament von Grails.
Und darauf gibt es dann Java-Komponenten eigentlich, also Spring,
also es wird wahrscheinlich, wenn man Java-Ahnung hat,
kennt man im Allgemeinen Spring ist,
will ich jetzt nicht so weiter darauf eingehen.
Sidemash ist noch so eine, ja, so eine Layout-Technologie,
wie man Ja, JSP seid oder GSP-Seiten heißt die bei Grails.
Ja, sehr schwierig netter darstellen kann. Wenn man
Grails installiert, kommt hier auch noch hier eine HSQL-Datenbank,
also so eine in Memory-Datenbank mit.
Da drauf liegt Hybernate, was man typischerweise auch kennt.
Wenn man aus der Java-Welt kommt, dann gibt es on top of
Hybernate noch eine Grails eigene Persistenzschicht, die Gorm heißt,
wo es sehr viel einfacher ist,
dass das ER-Mapping durchzuführen oder sehr viel kürzer zu formulieren ist
Auf dieser ganzen Infrastruktur hat dann Grails im Prinzip so ein
Model View Controller-Pattern implementiert. Also wer Spring MVC kennt,
der fühlt sich hier wahrscheinlich auch zu Hause.
Die Views sind in GSP geschrieben. Das ist sowas wie,
ja, JSP-Seiten und ein bisschen netter, sag ich mal,
vereinfachend. Dann die Domains sind Entities, also Objekte,
die letzten Endes auf der Datenbank dann Interabellen persistiert werden können.
Zwischen dem Model und den Views moderieren Controller.
Und die Geschäftslogik implementiert man typischerweise dann in einer Service-Schicht.
Das sind halt wieder
eigene Service-Klassen
Genau, der ganze Bildprozess, das ist hier noch an
der Seite dargestellt, der gibt es ja entgannt,
klingt nach Ant, ist aber ein bisschen besser.
Allerdings auch noch euer verbesserungswürdig. Also da basteln die eigentlich
die ganze Zeit noch ein bisschen dran rum. Ja,
ich weiß nicht, ist das halbwegs verständlich oder,
weiß nicht, bist du denn ein Java-Fitz so ein bisschen?
Ja, auf jeden Fall. Genau, das heißt,
die Technologien sagen ja... Das hat nicht gearbeitet,
aber das erzählen kann ich.
Keine Ahnung. Gut, also das ist ja letzten Endes das,
was bei Grays ein Stück weit dahinter ist.
Ich würde jetzt auch dann ein bisschen auf Praxis umschwenken
Ich habe ein kleines Demo-Projekt aufgesetzt und will euch gleich deinen Schock mit Source-Code. Genau,
also letzten Endes geht es darum, ich habe eine Datenbank,
wo Daten drin sind und was man typischerweise auf dem Server macht,
ist, man macht Abfragen, also SQL kennen sicherlich alle von euch,
eine etwas, naja, vom Abstraktionsniveau höher angesiedelt ist,
HQL, das heißt Hybernate Query Language.
Das sind quasi, ja, auch Select-Statements,
wenn man so will, die ja bei Datenbank unabhängig sind,
basierend auf der Hybernate-Technologie
Und von diesen Abfragen will man typischerweise dann relativ schnell so
was wie Jason rausrendern. Also letzten Endes, ja,
JavaScript-Datenstrukturen, die dann über einen Restservice ans Telefon kommen.
Und das muss halt relativ effizient gehen. Das will ich
gleich mal zeigen. Da habe ich so ein Plugin mal erstellt.
Können wir uns auch mal anschauen, wie in Grails,
ja, Plugins funktionieren. Die bestehen typischerweise aus so einem Plugin-Discriptor.
Dann kann man auch einen Service in einem Plugin implementieren.
Object Mashalling, das ist ein Mechanismus, wie bei den Grails,
sagen kann, wie Klassen in Jason umformuliert werden, sag ich mal.
Wir können mal darauf schauen, wie Tests geschrieben werden,
auch in so ein Plugin. Genau,
also das ist quasi das Plugin und dann habe ich noch eine Demo-Anwendung gemacht,
wo wir mal anschauen können, wie so ein Plugin benutzt wird,
wie man das einbinden kann.
Also Plugins macht man logischerweise, um das Ganze modular zu halten,
dass man das auch in anderen Projekten mal wiederverwenden kann.
Dann, es geht ja um Restservices, Postman,
das ist so eine Chrome-Erweiterung, kann ich euch mal zeigen,
falls das jemand auch nicht kennt, das ist eigentlich ganz nett.
Da kann man sich, ja, mal anschauen, wie das Ganze funktioniert.
Also wir können es auch mal sozusagen live und in Farbe
anschauen. Und das ganze Projekt ist auf GitHub,
also wenn ihr am Ende dann Interesse habt,
das mal nochmal im Source-Code näher anzuschauen,
gibt es hier das Plugin und wenn mal hier noch Minus-Demo anhängt,
dann ist das quasi das eigentliche Projekt.
Okay, ups. Was ist das denn? Mein Rechner
hat ein Problem. Die Auflösung ist jetzt natürlich etwa,
ja. Was denn, höhere Auflösung? Ja, wie
? Eigentlich ist die, hä? Die Pfeiler besser,
da wird nichts mehr
gesogen sind
Ah, okay. Aber das Fenster sehe ich immer noch
nicht. Okay. Das Komische ist, unten sieht das
ja relativ klein aus, der andere graue zu groß.
Monitor? Wahrscheinlich, ne? Sehr gut. Was machen
wir mal? Irgendwie sowas hier? Wie viel sehen sehen
Sie nichts
Ja, irgendwie klappt das nicht so richtig.
Das gibt es fast schon 2004. Das ist schon 1024. Machen wir
das, ja. Richtig fetter Nummer. Bitte? Ich
kann mal außen wieder einstecken, vielleicht hilft das was.
So, ich bin bewusst. Wir guten Dank.
Neustart, ne?
800 mal 600, sagt er.
Jetzt sagst du 1024. Jetzt kommt hier gar nichts mehr.
Das ist ja super. Also Ruhe ausscheiden.
Jo, ich probiere es nochmal
Ja, so sieht das hier auch aus, als ob
es ist verdammt schwarz. Ja, das sind runterständige.
Bitte? Offen ist auf jeden Fall zu hoch.
Ja, das, ach so, ja, hä.
Die Frage ist, wie kriege ich denn jetzt,
überredet ich hier runter, weil ich... Wie immer.
Warum Videos, da kann auch noch mal 600 Euro.
Das Blöde ist, hier ist jetzt auch alles schwarz.
Ja, befürchtungsweise muss ich immer neu starten, oder?
Also hier komme ich jetzt nicht weiter
Ja, es ist auch noch schwarz. Ja,
es ist immer noch schwarz. Es ist nicht doof.
Ja, und ich glaube, wenn... Puh,
ich sehe mal hier auf meinem letzten Zehner Stefan.
Ja, dann erzähl du mal, was du übergrätst.
Okay, dann mach du mal einen Neuhof fahren.
Ja, Lückenfüller, ne? Ja, keine Ahnung,
soll ich noch so bei Gräts erzählen vielleicht?
Ja, genau. Die Frage ist, wo man
da anfängt?
So ohne jegliche
Ja, vielleicht. Danke. Einfluss. Und es ist
von dommen Geld. Glaubt das jetzt David, oder?
Dann steckt das Ding ja mal direkt vielleicht ein, oder?
Eigentlich geht es da nicht jetzt nur weiter.
Technik. Technik, Feuer, 12, 12,
12, 12. Der war doch als der Arzt.
Das kommt da gar nicht mehr hoch, oder wie?
Ich bin da mal gebraucht. Ich brauche eine SST-Platte,
hatte ich
ja schon gesagt
Ich weiß nicht. Ist das denn hier
so das Getränk Pause? Ja, genau. Ja,
so ganz ohne irgendwas vielleicht, ist auch ein bisschen schwierig.
Ja, stimmt wohl. Der will nicht mehr.
Der jetzt abgeschmiert oder wie? Kommt gar nicht mehr hoch
oder wie? Das ist natürlich jetzt nicht so gut.
Das war auch lieber.
Das ist der Abdauer entstanden
Den kommt echt nicht mehr hoch, ne? Muss ich
auch sagen. Das ist ja auch, das ist ja auch,
das ist ja, wo wir an der Seite anrufen.
Das ist gut aus. Dann worf es ansonsten?
Also nicht so lange. Sollen wir sonst Richardsvortrag vorziehen?
Natürlich das. Es tut mir jetzt schrecklich leid,
aber das Ding fährt, also Apfel und das Urgeld
Ja. Ja, dann coole Folien. Ja,
Sourcecode zeigen ohne Folien oder ohne Inhalt ist ein bisschen schwierig.
Dann warte mal. Ja. Das ist ja echt noch richtig kacke.
Ja, kriegen wir alles. Eifersuche machen wir noch.
Das ist auf Richards, Richards Renning hat sich aber durchgerechnet.
Stimmt. Ich habe das eingecheckt auf GitHub.
Theoretisch kann man das auf deinem Rechner dann runterziehen.
Du hörst doch WLAN hier, oder?
Unser GitHub zeigt die Sourcecode-Dinger. Ja, das
können wir machen
Das wäre total gespannt, wie wir das selber sagen.
Ja, wenn der Kammer sich da alles passiert jetzt,
aber ich muss ja hinter meinen Zehen.
Das just your feeling to yourself. Läuft da was, Richard?
Was machen wir das einfach so? WLAN läuft. Ja,
genau, gibt es doch mal einen und dann... Nee,
so, du weißt ja nicht, da meine ich... Scheiße,
ist jetzt echt mal Rechner im Arsch,
so ein Mist
Sieht irgendwie nicht so gut aus, ne?
Bist du ein Fleisch? Ja, ja. Du,
jetzt weißt du, was jetzt mit Filmen gut... Erstens,
lasst den noch mal in Ruhe vor sich hin örbeln und
dann gucken wir nur, dass Richards rechnen.
Ja. Und Blut kommt absolut. Okay, das war was anderes dabei.
Ja, spannend. Wenn er das WLAN hat,
dann recht, das ist ja im Grunde genommen, ne?
Dann kann ich da weitermachen. Das ist mit dem WLAN
hingekriegt. Ja, sonst gibt ihr das Ding auch einfach.
Dann hast du Git installiert bei dir auf der Kommandozeile?
Da habe ich noch mal in der Richtung gesagt,
ja, zwei Jahre schon, da habe ich gar nicht.
Ärgerlich. Das Ding fährt nicht mehr hoch. Das möchte ich
auch schon. Da habe ich den neuen Watchmarkt gekauft.
Nee. Stefan, heiße ich mir hoch? GitHub.
Gute, nicht mehr hoch. GitHub infinite und dann,
ich kann das ja auch vorführen,
dann könnt ihr Leute mal gucken, wie geht es, funktioniert.
Gute. An der Hoffnung, dass dein Ding jetzt nicht auch noch abkackt.
Ich auch viel. Also mit der Auflösung werde ich jetzt nichts ändern.
Das ist sonst zu gefährlich. Da muss aber die Fenster
groß schieben, dann muss es halt so gehen.
Aber der macht jetzt gar nichts mehr, ist nur noch Apfel oder wie?
Achso, er will noch. Achso, da ist er
Sehr gut. Das hat nur ewig gedauert anscheinend,
ne? Genau, dann musst du gleich mal auslösen.
Toast, doch, jetzt geht's wieder.
War denn mal kurz noch nicht, ne?
Ja, er scheint sich jetzt hier gefangen zu haben.
Du brauchst eine SSD-Karte, das ist ein Ding.
Ja, es ist eigentlich ziemlich langsam. Was? Ja
, öffnen. Also wenn es jetzt wieder funktioniert,
wenn du das Ding eingeschickt und nicht in eine Auflösung spielst,
dann gibt's...
Man braucht immer noch
ganz schön lange
Ja. Ja. Ja. Ja. Ja.
Ja. Ja. Also richtig super Grund läuft das immer
noch nicht. Die Platte hat echt einen Hau mitbekommen
Dass die immer hier anstöpseln. Tatsächlich. Ja. Genau. Was
er jetzt macht, lässt es dir schon besser aus.
Eben kamen 800 mal 600, jetzt hat er irgendwie gerafft,
dass das irgendwie 1024 ist.
Der Typ macht links. Das kennt man. Ja.
Ah. Dann habe ich den ersten Song gereckt.
Genau. So richtig super sieht das immer noch nicht aus
Gibt es jetzt die Menge Fersto. Ich schätze,
es tut weh. Das tut weh. Das tut weh
. So. Tausend Dinger plöppen. Das ist die Songs.
Nee, auflösen will ich jetzt nicht mehr rumspielen.
Das ist nicht
so gut
Alles hat gesagt, die machen eine Ringe.
Es hat noch nicht so richtig auf Hochtouren.
Das ist schon was. Bitte? Skype stoppen.
Ja, keine Reaktion bisher. Der macht noch
irgendwelche Sachen
Wir sind beide bewerblich. Dadurch, dass das passiert,
lustig. Und ich würde erst mal so hochschenken,
vielleicht, wenn ich ändere. Das heißt,
es ist, wenn du mit dem großen, menschen,
menschen, menschen, menschen, menschen, menschen.
Was macht ihr denn jetzt noch?
Komm, hier,
geh weg
Das ist natürlich ein Film. Ja. Das ist ein
typisches Timeout. Ja, aber es kommt langsam, oder?
Das ist ein Ding, nach dem anderen fährt hoch.
Ich werde gerne zumachen quasi. Das können wir hier
mal zumachen. Ich kann ein bisschen mehr speichern
. . . . . . . . . . .
. . .
Das kennst du nicht. Macht der jetzt noch was oder wie
? Aber das Germanal geht. Ja, aber Sachen.
Aber guter Sport. Bitte? Grün-Absturz muss zu. Ja
. So skills nicht. Ja, theoretisch können wir auch
so erstmal anfangen. Vielleicht, also im Terminal ist das
jetzt zwar nicht so übersichtlich wie in der IDE,
aber vielleicht fährt die ja bei Zeit nochmal
hoch hier
Apfel plus ein bisschen größer. Ja, ja. Sonst würde ich
einfach mal anfangen, dieses Plugin so ein bisschen zu erzählen,
worum es da geht oder was das ist.
Also letzten Endes habe ich dieses Plugin gemacht,
um einfach mal anzuschauen,
wie man halt effizient aus der Datenbank oder beziehungsweise aus
der Datenbank Query heraus Jason
erzeugen kann
Und ja, das gestaltet sich so,
dass man halt, oder andersrum gefragt,
wer hat denn von euch schon mal ein Plugin gemacht in Grails?
Okay. Das ist ja noch nicht mal die Hälfte.
Okay. Gut, also so ein Plugin ist Zeugmann in Grails
relativ einfach. Da sagt man Grails, Create Plugin,
gebt den Namen an, drückt Enter, dann hat man Plugin.
Das habe ich hier gemacht an der Stelle.
Und dann gibt es halt so einen typischen,
das nennt sich Plugin Discript,
oder ist es hier diese Datei,
die heißt dann,
wie das Plugin und dahinter noch
Grails Plugin
Was ist da drin? Ja, ja, ja,
ja. Geile True. Das ist recht. Das ist
aber echt Hardcore-Vortrag hier, Mann, Mann, Mann.
Das wäre nicht auch bei so einem Live-Coding-Beusternstaller,
als das Echo vom Turm. Genau, also so sieht
das ungefähr aus. Also das ist dieser Plugin-Discriptor,
das gibt den meisten Teil, generiert Grails davon schon.
Man hat hier so eine Version,
kann dann sagen, hier, ab welcher Version
dieses Plugin gelten soll
Man kann hier, das ist ganz nett, so Plug-in-Excludes angeben.
Also wenn man später das Plug-in veröffentlicht,
dann werden die Sachen halt rausgenommen. Das ist ganz praktisch,
weil man hier in diese Controller- und Domain-Verzeichnisse kann man halt
zum Testen des Plug-ins Sachen reinstecken, die dann,
wenn das gewandelt wird, halt rausgenommen werden.
Das habe ich hier auch gemacht, kann ich gleich auch
nochmal zeigen. Titel, Outer, la la la.
Was ist dann halt typischerweise auch gibt in dem Plug-in-Discriptor?
Sind dann halt
solche Hooks
Wo dann halt gesagt ist, du bist Dynamic Messers,
do with Spring und so weiter. Das heißt,
wenn Grace hochfährt, initialisiert das oder richtet das bestimmte Dinge ein,
unter anderem die WebXML, die zur Jabai-E-Spezifikation gehört, die wird halt erzeugt.
Da kann man sich hier reinhängen und dann eigene Sachen,
eigene Filter, eigene Surflets oder sowas da reintun. Man kann hier eigene Springbeans registrieren,
was ich hier zum Beispiel gemacht habe, wie eben gesagt,
ist hier so ein Object-Marshaller, registrieren,
komme ich gleich nochmal darauf zu sprechen, dann, ja,
on change und config Change, also es ist zum Beispiel,
wenn man an der Anwendung etwas verändert dann werden diese Callbacks aufgerufen,
um entsprechende Änderungen durchzuführen.
Das ist sozusagen die Kernschaltstelle von Plugins in Grails.
Was jetzt Teil der, oder der Hauptkern dieses Plugins ist,
ein Service, die sind typischerweise in Grails App.
Services. Genau. Was ist das jetzt hier,
eine Serviceklasse
Die danach auch, also wenn eine andere Einwendung jetzt dieses Plug-in benutzt,
dann steht dieser Service des Plug-ins auch der anderen Anwendung als Spring Bean zur Verfügung.
Das heißt, man kann da in Controller oder anderen Services
sich diesen HQL-DTU-Service initiieren lassen, darauf zurückgreifen.
In dem Service habe ich hier jetzt zwei Variablen oder zwei Beans von Graves mir initiieren lassen.
Also sprich, wenn hier dieser Service von Grace, naja,
benutzt wird, dann sind hier die entsprechenden Variablen drin.
Das ist die Session Factory von Hybernate. Das heißt,
hier komme ich zum Beispiel an die Die aktuelle Session dran und die Grails Application,
die Config variabel und verschiedene andere Dinge noch enthält.
Was dieser Service sie hauptsächlich macht, ist diese Methoden hier
zu implementieren, Execute, DTO-Query. Das macht Folgendes,
also das führt letzten Endes eine Service-Methode aus,
also eine HQL-Query auf dem Server aus.
Das sieht man hier. Hier wird quasi auf,
also eine Methode wird hier aufgerufen, mit diesem Namen und der entsprechenden Query als Aufruf.
Das ist im Prinzip nichts anderes als ein Rapper,
um diese typischen Execute Query-Methoden von Domainclastern Grails,
also Grails kann man auf jeder Domain, also auf jeder Datenbank-Entity sagen,
execute Query und dann entsprechenden HQL-String, also eine Abfrage,
abfeuern.
Das ist letzten Endes nichts anderes als ein Rapper da drum.
Dieser Methodenaufruf, was jetzt hier besonders ist, ist,
dass am Ende das Ergebnis in entsprechender DTUs konvertiert wird.
Das ist sozusagen eine gemeinsame Funktion,
die von diesen ganzen Curies benutzt wird
Kennt ihr Execute Query von den In-Grails, also die Harco-L-Currys,
genau. Das ist letzten Endes diese Zeile hier und das
ist nur deswegen so oft implementiert worden,
hier mit einem String und einem Arc,
das sind die verschiedenen Signaturen, die auch Grails bereitstellt.
Und mit dieser Signatur wird quasi die herkömmliche Execute-Curry-Methode von Grails
aufgerufen und das Ergebnis wird dann gewandelt in ein entsprechendes DTO.
Und diese Methode ist auch Teil dieses Services,
das ist eigentlich ganz spannend,
wie das funktioniert.
Ups. Geburtstag von David
Das ist diese Methode hier. Also im Grunde genommen ist es
ja relativ einfach, aus einer SQL-Query die Daten rauszusammeln.
Man führt diese Query aus und kriegt dann eine Liste von Objekt Arrays.
Also eine Liste deswegen, weil es verschiedene Zeilen sind,
die bei der Query rauskommen. Und ein Objekt Array,
weil es halt typischerweise verschiedene Felder gibt, die das Curry-Ergebnis darstellen.
Was ein bisschen problematisch ist, ist die Feldnamen rauszukriegen.
Also so einem typischen DTO will man ja
eine Hashmap haben und dann steht Key Value,
Key Value
Und darum habe ich, hier ist hier so folgendermaßen gemacht,
dass ich aus der Query,
die Feldnamen halt raus extrahiere und danach die entsprechenden Zeilen in DTOs wandle.
Also Rose Collect heißt, die werden die einzelnen Zeilen durchgegangen.
Dann wird jede Zeile ein solches HQL-DTO erstellt.
Klasse werde ich gleich auch nochmal zeigen.
Und dann entsprechend mit den Feldern gefüllt. Wie werden diese,
also was jetzt ein bisschen tricky ist, ist,
wie man aus der HQL-Query diese Feldnamen extrahiert
Sieht man jetzt hier, also hier wird es jetzt ein bisschen sehr technisch,
also wir von Highbyne endlich so die große Ahnung hat,
wird hier gegebenenfalls ein bisschen aussteigen.
Also aus dieser besagten Session Factory von Highminate hole ich mir die aktuelle Session,
wo ich mir dann hier so einen Query-Plan, so einen Translator.
Letzten Endes holt man sich dann hier die Slack-Claws als AST-Knoten
raus und mit solch einer Visitor-Strategy kann man dann hier,
mit so einem No-Traverser über diese,
über das Pass-Ergebnis drüber gehen und kann sich dann hier von
Highbynate die entsprechenden Felder die in der HQL-Curry drin ist, rausziehen.
Also ich passe jetzt nicht zu Fuß, die Selectfurs,
Claws und HQL sein, benutze quasi den Hybernate eigenen Parser.
Bis hier sage ich eben sozusagen Pars, diesen HQL-String.
Und dann gehe ich hier sozusagen mit diesem Note-Traverser über die,
das Pars-Ergebnis drüber. Und schaue mir dann an,
ob der entsprechende Knoten in der Select-Claws,
ein alias ist oder nicht, das abhängig von dem,
wenn ich,
also ich kann ja der Selectfurs in HQL halt den einzelnen Feldern alias nahen geben,
dann würde im Prinzip,
wenn ich das tue,
in dem Fall der Feldnamen des DTOs der Alias-Name sein
Ja, das ist dann ein bisschen angenehmer zu sagen.
Oder zum Beispiel, wenn man jetzt aus zwei verschiedenen Domains,
wir haben ja die joint und beide haben meinetwegen Property Name,
dann müsste ich jetzt sozusagen zwei Name-Properties im DTO haben.
Das ist ein bisschen problematisch, deswegen kann ich eine HQL
alias Namen nehmen und dann werden die halt in das DTO eingebaut.
Okay. Hier am Ende wird das dann noch entsprechend in
eine Liste eingebaut und wenn ich dann diese ganzen Feldnamen habe,
dann wird, wie eben schon gezeigt, hier dieses HQL-DTO zusammengebaut.
Also dieses HQL-DTO ist relativ unspannend, dass es letzten Endes eine Hashmap
Und was wir eben gesehen haben, ist in diesem Plugin-Discryptor.
Jetzt muss ich mal gucken, wie ich da wieder hin zurückkomme ohne IDE.
Das ist echt spannend. IDE ist fertig? Oh.
Sehr schön. Aber richtig schnell ist die noch nicht die Idee.
Geht so. Joey ist doch schnell. Kannst du noch mal
kurz meine Great-Kannissen sind sehr angeraucht und sagen,
was eine DTU ist
Also DTO ist ein Data. Genau, Data Transfer Object, ne?
Das ist letzten Endes, vielleicht sagt ihr ja Value Object was,
das ist so ein bisschen die alte Bezeichnung dafür.
Letzten Endes ist das ein Objekt, was einfach typischerweise oder
herkömmlich desealisiert wird oder sealisiert wird über enge Schnittstelle geht,
Rest, Soap, was weiß ich was.
Und auf der anderen Seite wieder desealisiert wird.
Also sprich, das ist ein Transferobjekt halt.
Also das trifft den Namen eigentlich schon ganz gut.
Es ist einfach nur ein Pojo, wo halt Daten reingestopft werden.
Das geht über einen Kanal drüber und auf der anderen Seite
kommt es wieder raus
Das wird Jason quasi. Das ist sinnignifiziertes Objekt. Genau,
Jason an sich ist ja nur ein String,
aber das ist ja per se kein Objekt. Genau,
und meistens ist es ja netter,
wenn man in seinem Service ist, halt mit Objekten hantiert,
wenn man dann halt sein kann, was weiß ich,
man dereferenziert, jemand hat Typen in der Hand und so weiter.
Das geht, so sind überhaupt besprachenabhängig, glaube ich.
Das ist dann sprachenabhängig, genau, ja, richtig.
Aber letzten Endes ist was der Hintergrund von DTO ist, also von Data Transerver Objects.
Genau, also was man hier jetzt noch sehen kann,
ist diese Geschichte, das ist so eine Grails Spezialität.
Hier wird sozusagen dem Grails Jason Objekt Das ist hier so ein,
ups, Upstract Converter, also es kommt aus dem Grailstranger,
wie kann man sozusagen sagen, okay,
wenn so ein HQL-DTO als Jason rausgerendert werden soll,
dann macht das folgendermaßen, Return einfach eine Hash-Map,
die sozusagen aus diesem HQL-DTU konstruiert wird.
Also letzten Endes weiß der,
wie in der Hash-Rap in Jason rausgeschmissen wird, typischerweise,
Jason geschweifte Klammern und dann immer Key, Doppelpunkt Value,
come on, immer so weiter,
das ist halt drin.
Woher weiß die Hash-Map,
was die mit so einem HQL-DTU aufgeführt haben
Die Hashmap weiß das, weil,
jetzt kann ich hier in der Idee hoffentlich da effizient draufgehen und siehe da,
dass HQL-DTO Extended Hashmap, ich habe ja gesagt,
das ist relativ trivial von der Implementierung her,
daher weiß die Hashmap, was sie mit der Hashmap zu machen hat.
Nein, die Mashma, da wird das registrieren, da weißt du,
nimmt er nicht einfach die Mashmap für den Oberschlag für die Maschine.
Hatte ich auch probiert im ersten Step, macht er aber nicht. Was aber eigentlich sinnvoll ist,
weil an der Stelle oder was wir in einigen Projekten gemacht haben,
ist, an dem Punkt hier zu sagen,
Hashmap find all where Value ist ungleich null.
Dass der zum Beispiel über die Schnittstelle nur diejenigen Key Value-Pärchen überträgt,
wo überhaupt ein Value vorhanden ist. Das heißt,
das iPhone oder das Telefon auf der anderen Seite sagt,
okay, wenn der Value nicht vorhanden ist, dann ist der wohl null,
dann spart mal noch ein bisschen Größe auf den Kanal.
Und da kann man sich hier natürlich nett reinhängen.
Dass man an der Stelle sagt, okay, HQL-DTU ist
das ein spezielles Ding. Dann würde ich das verstehen.
So macht das hier nicht so sonderlich viel Sinn.
Also im nächsten Zepter ist ja Version 01 des Plugins,
könnte man zum Beispiel hingehen und sagen, Konfigurations-Switch,
wenn das halt hochkomprimiert werden soll,
dann render es anders.
Oder dir kann man halt
entsprechend eingreifen
Genau, also nach der Argumentation würde es ja gar keinen Sinn machen,
hier überhaupt ein DTO draus zu machen oder einfach direkt eine Hashwap zu schicken.
Das ging ja natürlich auch. Aber wenn man die Eingriffsmöglichkeit haben will,
dann muss man halt so eine eigene Klasse dafür nehmen.
Genau, also das ist im Endeffekt das Plugin.
Es gibt ja auch Tests dazu.
Kann man sich mal angucken, wie das ungefähr aussieht.
Dann kriegt man auch vielleicht ein bisschen eine bessere Idee.
Zum einen, wie man Tests in Grails schreibt.
Und zum anderen, wie diese Queries überhaupt aussehen.
Jay Unit,
sagt euch das was
Das kennen alle fast, bis auf da hinten. Genau,
also J. Unit funktioniert typischerweise so,
man hat hier so eine Testklasse, da sind halt Testmethoden drin,
die werden aufgerufen und ein Setup, das ist was,
was sozusagen vor jedem Test immer ausgeführt wird.
Ich in dem Setup, mache ich hier typischerweise super Setup,
hole mir diesen Service, diese beiden Variablen,
die ich eben schon erwähnt hatte, die da injiziert wird,
injiziere ich jetzt hier von Hand.
Das ist ein Integrationstest, das heißt,
ich habe eine Datenbank zur Verfügung,
erstelle mir in einer Test-Domain,
die ich noch nicht gezeigt habe,
das ist eine eigene Tabelle,
die heißt einfach Test-Domain mit dem Spaltenname und Duration
Erzeuge ich hier sozusagen einen Datensatz, New Test Amain,
speichere die. Flasche, das ist direkt auf die Datenbank
und sag Fail on Ara Two. Das heißt,
der committed, dass sie auch an einem Committed ist nicht,
nein, aber er inserted ist auf der Datenbank direkt.
Also sprich, aus diesen beiden Statements resultieren zwei Inserts auf der Datenbank.
Ich weiß nicht, ich kennt das hier,
jeder so ein bisschen, also wie das funktioniert hier mit safe,
also relativ Grundlagen von Grails, wie das funktioniert.
Was dann hier passiert in dem ersten Test,
da sage ich hier den Service, den ich habe,
Execute DTO Query, dass sie jetzt dann eine ganz normale HQL-Query.
Wichtig an der Stelle ist, dass das Skalare hier sind,
damit ich die danach in meinen DTO reinpacken kann.
Also ich selektiere jetzt den Namen und Duration von meiner Test-Domain,
also sortiere das hier nochmal, damit ich besser meine S-Hölzer am Ende machen kann.
Und ja, dann schaue ich im Prinzip das dann im Endergebnis,
in denen hat AQL-D-TOs, Name 1 und Name 2 drin ist.
Also wenn das... Oh, oh.
Nein, nein, nein, eigentlich schon wieder.
Wenn er wollt und das Ding hier mitspielt.
Können wir den versuchen mal laufen zu lassen
Da mache ich am besten den Breakpoint.
Da noch einen hin. War das echt so lahm,
der Rechner. Ich glaube, hier ist die Festplatte ja
echt einen mitbekommen
Gut, ich kann ja schon mal weiter erzählen,
irgendwann wird er in den Breakpoint.
Kommt was? Ah, okay. Genau. Also jetzt
kann ich hier auch in Intellijoy da drauf gehen,
sehe, dass der hier dann in diese Query reingeht,
die Rose rauszieht,
die kann ich beim Breakpoint hinsetzen.
Dann läuft er entsprechend da rein, gehe noch weiter.
Und jetzt habe ich im Prinzip in diesen HQL-DTOs,
das sieht man hier unten. Das ist jetzt letzten Endes eine Array-List,
weil das Ergebnis der Query ist ja eine Liste.
Und die Elemente sind natürlich diese, besagten HQL-DTOs und haben jetzt als Felder Duration und Name.
Die haben deswegen die Felder Duration und Name,
weil das halt hier die, ja,
hier angegeben wurde an der Stelle, in der Select Claus.
Was dann auch ähnlich funktioniert, ist,
sich zum Beispiel hingehen kann und gebe hier aliasse vor.
Das ist das, was ich eben sagte. Ich habe jetzt hier wieder eine Test-Domain,
selektiere entsprechende Namen und kann dem ein alias geben,
dann ist im Endergebnis, erwartet er dann in dem DTO entsprechend diese alias Namen.
Genau, er ist Duraton alles. Und ja,
ganz am Ende ist das der Service, der getestet wird,
wenn wir noch ein paar andere Sachen hier gemacht,
also wir zum Beispiel geschaut, dass man hier nicht sowas macht,
weil das funktioniert ja logischerweise nicht in dem DTO,
also dann wird da auch entsprechend eine Acception geworfen,
dann, wenn man zum Beispiel sowas macht,
also in HQL kann man auch Objekte zurückgeben,
also hier sage ich dann Selects, also die Domain,
also das Objekt, Test-Domain, das kann natürlich auch nicht funktionieren,
logischerweise, weil das halt nicht sehralisiert werden kann.
Das ist kein Skala. Dann fliegen halt entsprechende Acceptions.
Genau. Ja, Der Ansatz, den wir gesagt haben,
Praxis, ist ja erst bisher einmal sonst,
als würde ich das vorstellen, drüber.
Warte mal was. Aber ich frage mich,
was würdest du mit dem Einsatz für eine Strategie überfolgen,
wenn du strukturiertes Jazzen erzeugen würdest?
Ähm, tschüss. Ja, also im Grunde hast du recht,
das ist natürlich für flache Strukturen eigentlich nur, genau,
das kannst du eigentlich im Grunde genommen nur für flache Strukturen verwenden.
Also dann, ja, musst du in der Tat dir das zusammenbauen an der Stelle.
Dann würde man wahrscheinlich ja, Objektquarries machen.
Also herkömmlich machst du das halt typischerweise so, dass du Querries machst,
da kommen Objekte raus und den Objekten sagst du,
wie sie halt serialisiert werden.
Also wie sie in Jason umgewandelt werden.
Du registrierst dann mehrere Object-Marshaller, aber das beinhaltet halt,
dass du diese ganzen Klassen modellieren musst.
Du musst dann sagen, ich habe meinen Top-Level-DTO und da drin ist ein Sub-Level-DTO.
Also so heißen die beiden Klassen, sage ich mal,
die in deinem strukturellen Ansatz jetzt dann ineinander kommen.
Mit dem klassischen DTO. Genau,
und dann ist so ein klassischer DTO-Muster,
muss die dann aber beide modellieren
Ja, hast dann natürlich auch, musst dann auch beide Marschallen.
Also du musst dann sagen, wie wir werden jetzt gewandelt.
Das ist natürlich ein gewisser Mehraufwand.
Klar, manchmal kommt man da sicherlich auch nicht drumherum.
Nur wenn es halt möglich ist, das flach zu machen,
also nach unserer Erfahrung ist das meistens so,
dass es halt möglich ist, das relativ flach rauszuziehen.
Also sicher ist nicht immer der Fall,
aber dann ist das halt eine ganz nette Möglichkeit, das zu tun.
Genau, die App selber Also ich habe noch eine kleine Demo-App gebaut,
wo man sich das auch mal anschauen kann, wie das ungefähr zusammenspielt.
Hier ist dann so ein Rest-Controller drin,
also Grails kommt ja typischerweise, wenn man die Doku mal gelesen hat,
da geht es immer um Orsa und um Buchs.
Das sieht dann ungefähr so aus, dass man sagt,
man hat hier eine Orsa-Domain und eine Book-Domain.
Für die, die jetzt nicht so bewandert sind da drin,
also das sind besagte Entities, die letzten Endes auf die Datenbank persistiert werden.
Das heißt, es gibt ja am Ende auf der Datenbank
so eine Book-Tabelle,
die zwei Spalten hat,
Title und Year
Es wird hier gesagt, dass es einen Foran Key
gibt auf eine andere Tabelle, die heißt Authon.
Und es wird gesagt, dass es Constraints gibt auf der Datenbank,
dass der Titel nicht leer sein darf,
also nicht null sein darf und nicht leer.
Und das Jahr darf auch nicht dalible sein. Das wird er
dann auf der Datenbank auch zu Not Nolable Constraints führen.
Genau. Authon sieht ähnlich aus. Der einzige Unterschied ist
dann hier, dass man hier so eine Hass-Many-Geschichte hat.
Das heißt, im Objektmodell kann man das modellieren,
dass das in beide Richtungen geht.
Also der Autor hat mehrere Bücher und das Buch hat einen Offer,
was man auf Datenbank-Ebene typischerweise nur in eine Richtung macht,
nämlich beim Buch, sag mal,
wie der Author ist,
über so
ein Foran Key
Dann gibt es hier so einen Rest-Controller,
also Controller and Grails sind halt der Einstiegspunkt,
wenn ich einen Request an den Server schicke,
dann gibt es so ein sogenanntes URL-Mapping und dann geht das
relativ schnell halt entsprechend hier in so eine Methode rein,
List oder Show.
Und das will ich jetzt einfach mal, ich hoffe,
ich kriege die Anwendung jetzt hochgefahren.
Das macht der Rechner hoffentlich noch mit. Dann können wir
uns das einfach mal anschauen, wie das ungefähr aussieht.
String? Das ist ein einsamer String und das ist
ein Herbst. Das ist ja auch spannend
Das muss man sagen. Oh, gute Rede, ja
. Echt wieder ein bisschen verloren. Da steht ja so
ein bisschen verloren rum, ja.
Ich finde, das eben geschrottet hat. Aber gut,
ich glaube, den braucht man nicht.
Breakpoint? Breakpoint? Nein. Aber wenn man jetzt in
der AQL-Ferie von Browser auf Pups einfach nur vorbei ist,
direkt auf Pups
Dann kriege ich ja eigentlich nur das Liste von Büchern
an der Stelle, von Halber noch wieder.
Genau. Ich kann dir die Query auch kurz zeigen,
wenn der noch hochfährt. Er ist ja ein bisschen...
Bei Marshall, den ja aber nicht umwandeln, weil ich
ja früher einen Punkt, keinen Marshall da registriert habe.
Macht er das, wie wenn er im Standard Race to May war,
scheint mit Glas und ID und so weiter.
Genau, also was dann rauskommt, ist in der Tat
, dann hast du dann alle Properties da stehen.
Das hättest du ja. Aber dann hast du blöderweise auch
immer Klaas und Klaas und ID
Ja, also dann haben wir nicht eigentlich,
es gibt eigentlich sowieso, kommen so, Objekte zurück.
Ja. Warum dann eigentlich das in so eine Herstellung kommt?
Also schon einfach das Objekt durch den Jason-Singlesieger zu Jati.
Also im Allgemeinen macht man das nicht, weil du halt
nicht deine Datenbankstruktur über eine Schnittstelle nach außen geben willst.
Das ist so ein Sicherheitsding auf der einen Seite.
Und meistens kommt da auch noch jede Menge Kram mit,
der nach außen hältlich interessant ist. Also wie die Klaas,
wie die ID, wie irgendwelche Version von Optimistik,
Locking und lauter Sohnkram, das frisst ja alles Bandbreite,
ne?
Ja,
das stimmt.
Plus Komparbilitiert
Ja, gut, genau. Ich habe so eine Struktur im Händlerz.
Genau. Hat man sofort ein Problem mit den Händen.
Ja, genau. Also das ist ja super wichtig bei
so Apps, weil du kannst halt nicht kontrollieren.
Das ist ja auf jeden Fall,
wenn ich jetzt ein Progressiv von dem Progress respekt da rumgenenne,
dann merkt bei dir, dass das wird in die QR-Pläne genutzt,
man nennt die um.
Plötzlich heißt es mal in den PO anders,
dass mich halt in meiner Schnittstelle ist.
Das stimmt. Nee, nee, das stimmt schon.
Also du müsstest dann alias verwenden in der HQL-Query,
wenn du das auf den alten Namen in der restlichen Stelle gehalten benutzt.
Das stimmt. Du weißt gerade,
ich meine HQL wäre ja nicht so,
dass ich im Alias dann den gleichen Namen nehme,
wie die Zaubertüte sowieso schon ist
Es sei denn, es gibt noch eine andere Tabelle,
wo dann auch der Name feiern werdet. Das ist schon richtig. Ja,
das ist so ein typisches Problem, dass du,
wenn du einmal eine App rausgegeben hast,
dann kannst du sicher sein, dass jede Version, die der App,
die du jemals released hast, Ego noch im Orbit ist.
Also dann geht das halt los, dass du gucken musst,
dass diese Rest-Services, die du halt baust, am besten eine Versionierung haben.
Dass du sagst, dann rest V1 und dann gibt es
dann irgendwelche Methoden, Rest V2 irgendwelche mehr. Ja, es ist schwierig. Also ich glaube,
dass das 9 plus ultra, ich glaube,
wir waren auf der C-Bit Neudi,
also ich schwenke jetzt gerade mal ein bisschen ab,
auf der C-Bit hatte IBM tatsächlich so einen Lösungsvorschlag gemacht,
dass man halt Schnittstellen-Geschichte in der App aktualisieren kann,
dass man sozusagen in der installierten App die Schnittstelle in der App ist,
aktualisiert.
Das ist wahrscheinlich die einzige Möglichkeit, wie man das hinbekommt.
Also ich weiß nicht genau, wie sie das machen,
aber ja, ansonsten hast du das Problem.
Bitte? Bei iOS geht das nicht gegen Axtor-Richtlinie.
Auch das ist ja dann dynamisches Nachlagenfachholen. Ja, wahrscheinlich.
Ja, sie haben jetzt geschrieben zu sein, dass das funktioniert.
Das ist gerade so eine Art VSDL-Lebt und dann... Ja,
wie auch immer das, ich habe mir das noch nicht im Detail angeguckt.
Genau, aber was ich eigentlich zeigen wollte,
hier an der Stelle ist hier dieses Postman,
das ist eigentlich ganz nett, falls ihr das noch nicht kennt,
das ist so ein Chrome-Plugin und War das mal groß?
Da kann man jetzt halt entsprechend solche Restcalls testen.
Ich hatte ja jetzt hier einen Breakpoint gesetzt auf List,
wenn ich mich da recht erinnere.
Also da. Und ich gehe jetzt hier mal drauf und sage Cent.
Und dann geht er halt entsprechend da rein und dann kann man sich anschauen,
also hier kann man jetzt theoretisch schon durch, die beiden,
kennt er wahrscheinlich.
Und dann kommt es halt in den Post-Man-Groom. Kommt dann
halt entsprechend hier das Jason raus. Also für die,
die Jason nicht kennen, das ist dann typischerweise Listen.
In Java-Script sind hier so mit so eckigen Klammern
Und in den geschweiften Klammern sind dann halt Key Value,
also eine Hashmap, Key Values, in dem Fall irgendwie Harry Potter-Bücher.
Und dann tschüss. Chasson lag in the fire of box,
kann das auch erzählen. Das kann er es auch anzeigen,
aber das Firefox-Plugin kann zum Beispiel nicht basic out übertragen.
Das kann hier Geld, Post, was weiß ich,
was Parameter übertragen. Das kann, also hier XML-Pasen,
das ist schon ganz nett eigentlich, dieses Ding.
Ja, das ist in der Zeit, das tut ja,
da ist oben auch noch ein Ruheaustausch.
Ja, stimmt
Wenn man Facebook zum Beispiel, aller macht das Twitter fürs Buch,
auch mit ab übrigens auch. So, und ich weiß
gar nicht, wie viel Zeit haben wir jetzt.
Guck mal hier, August, David,
eigentlich... Was schätzt du, wie viel Zeit?
Wir haben jetzt ein bisschen Zeit verdödelt mit der... Mal
ein bisschen weiter, okay. Also ein weiteres Konzept,
also was wir jetzt die ganze Zeit ja eigentlich nur angeschaut haben,
ist der Weg von der Datenbank raus,
Jason über die Schnittstelle Richtung Mobile.
Aber es gibt ja natürlich auch logischerweise noch
einen Weg vom Mobile in den Server rein
Das ist hier mal exemplarisch dargestellt, dass man sagt,
man führt hier so einen Restcall aus und sagt,
okay, ich will jetzt alle haben,
wo nur jemand wegen der außer meinetwegen Rowling enthält.
Das soll natürlich dann in der speziellen Curry münden, also ich das jetzt hier mache.
Das Ergebnis kann man sich, denke ich, vorstellen,
was da rauskommt, weil da kommen jetzt nur die Bücher raus,
die von Rowling eben erstellt wurden.
Und das funktioniert so in Grails, das ist eigentlich ganz nett.
Gehört leider nicht zum Scare-Folding, also wenn man Code-generierten kann,
also Grails möglich ist, durch ein sogenanntes Scare-Folding-Code-Generation zu machen,
also man modelliert quasi nur seine Entities,
dann so ein paar Befehle ein und dann Feldcode raus,
aber das ist leider nicht drin.
Das sind sogenannte Command-Objects. Und die funktionieren so,
dass man formulieren kann, was in seinem Post,
wenn man an den Server rangeht, drin sein soll.
Also sprich, in dem Fall habe ich jetzt gesagt,
haben wir ja eben gesehen in diesem Postman,
ein Postparameter bei dieser Arthur und ich sage an der Stelle,
nyable falls, blankfalls.
Das heißt, ich erwarte sozusagen an der Stelle,
dass der Post dann den Server geschickt wird, ja, diese Eigenschaften halt erfüllt.
Und das kann ich in Grey in dem entsprechenden Controller auch abfragen.
Das heißt, ich kann hier sagen, Show,
das war eben, was wir bei Postman angegeben haben,
da kann ich das Command-Objekt, also das,
was hier ankommt, fragen, hast du Fehler.
Sprich, wenn ich jetzt den Offer mal leer lasse,
dann wird er da reinlaufen, hoffe ich mal.
So, ich mache mir hier einen Breakpoint wieder drauf,
benutze dann hier mal diese Query und sage,
Cent, und dann läuft er entsprechend da rein.
Also jetzt sieht man halt,
dass er hier entsprechenden Fehler, die Bug-mäßig weglockt,
und dann am Ende eine Jason-Antwort schickt mit Bad Request,
also der Request-Status ist dann halt 400 oder was das ist
Sieht man dann hier, das kommt bei den Postman auch an.
Dann sagte er, hier, Bad Request.
Und das ist diese typische Brails-Validierung, dass er sagt,
die Eigenschaft außerhalb des Typs, sowieso darf ich nahe sein.
Das sieht man jetzt leider nicht,
weil der Bildschirm zu klein ist, nicht ergrollen kann.
Die Rollen ist nicht. Was ist die jetzt? Warte,
ich war da hingestellt. Oder hieß der Language, hello it,
ist nicht so viel wie Krankensache, die der braucht.
Ja, das denke ich auch. Also das wird das Low-Cale
des Requests sein. Also wenn man es noch hübsch machen wollte,
ich meine, das ist ja jetzt eine Systemmeldung,
würde man wahrscheinlich dann sagen,
hier in diesem Fehlerfall switche mal das Low-Cale auf Englisch oder was
und dann kommt da halt nur was Englisches raus.
Beziehungsweise die andere Frage ist,
ob man das überhaupt so macht in dem Produktionssystem,
weil das ja doch schon über die Anwendung einiges zeigt.
Aber fürs Entwickeln ist das natürlich sendet. Kann man das
immer nachgucken, ob da wirklich jetzt die Ebene geschenkt hat?
Ja. Da sieht man es jetzt nicht.
Ich weiß leider nicht genau, wo man das jetzt sehen
kann,
was er sendet
Doch, ich weiß wahrscheinlich schon, wo.
Hier geht das wahrscheinlich. Du? Geht nicht gleichzeitig,
das ist ja auch mal lustig.
So, da müsste man jetzt eigentlich was sehen können,
Und das ist das wahrscheinlich. Ja, genau. Also
im Grunde genommen ist es auch das. Also diese Command-Objects ist halt ganz nett. Ich weiß nicht,
wenn der das gescarefreundet sieht,
dann kommt ja typischerweise immer so eine Orgie von Params,
wo dann halt, also Params ist letzten Endes auch wieder eine Hashmap,
die einem da zur Verfügung gestellt ist, wo die Post-Parameter,
die Keys sind in der Hashmap und das,
was gepostet ist, in Form von Trainings ist dann der Wert,
dieser Hashmap.
Und dann muss man natürlich die ganze Zeit zu Fuß erstmal gucken,
kann ich das in den Zieltyp umwandeln?
Also zum Beispiel in dem Fall ist ja Duration
Ist ja ein Integra. Das heißt,
sie muss erst gucken, ist denn das,
was in dem String drin ist, ein Integra?
Und dann kann ich es wandeln. Und dann kann ich
gucken, ist das dementsprechenden Wertebereich drin.
Und das gibt dann einen typischerweise ziemlichen Spaghetti-Koten mit diesen ganzen Params.
Und das ist eigentlich netter, wenn man diese Command-Object-Objekte benutzt,
weil dann im Prinzip das Teil des Requests ist.
Also so ähnlich wie ein JSF. Man hat eine Phase,
wo dann das Parameter-Bining und die Validierung, die Typ-Konvertierung und so weiter passiert.
Und dann geht erst der eigentliche Code los.
Und man überlässt das dem Framework, das alles zu machen,
das war eigentlich ganz nett.
Genau. Ja, im Grunde genommen war es das,
was ich zeigen wollte
Gibt also einen groben Überblick über Grails, Plugins und so weiter,
was man so mit Highway Nates machen kann.
Habt ihr noch Fragen oder seid ihr komplett erschlagen?
Mir ist gerade noch eine Idee gekommen, wie wird das
gehändet und wenn es sehr viele Eintricke nicht da einwachsen wird.
Habt ihr denn einfach eine sehr große Antwort?
Also was du machen kannst, ist,
ich hoffe mal,
ich habe jetzt hier Internet
Ja, also das ist dieses normale Execute Query und dieser Service,
den ich gemacht habe, der hat ja diese ganzen Signaturen,
die auch Execute Curry hat, die sind im Prinzip aus dem Grail Source Code mehr oder weniger rauskopiert.
Was du ja machen kannst, ist im zweiten Parameter,
also hier, das ist erstmal die Parameter,
die hier drin verwendet werden,
wer A-Branch gleich London und hier hinter kannst du sagen,
Max und Offset, das heißt,
du bist in der Query natürlich eigenverantwortlich, dafür zuständig,
dass du sagst,
ich will maximal zehn Ergebnisse haben und der Offset,
also das erste Element soll bei fünf anfangen und
dadurch kannst du natürlich in Windowing,
also Paddination machen
Eigenmöglichkeit. Genau. Ich weiß nicht, ob du uns
noch eingebohrt hast. Das ist vielleicht auch nicht schade,
dass es eine andere Möglichkeit gibt.
Ja, also es gibt noch zahlreiche Möglichkeiten. Das ist nicht
fein. Genau, das sind hier die ganzen Dinger.
Also genau, das ist jetzt die Grails Doku.
Also man kann zum Beispiel hier, was haben wir denn
hier, Find All zum Beispiel.
Ich mache so, wie ein nettes Beispiel, der kommt.
Die geben. Das ist genau, das ist auch wieder
Hybernade. Find All bei. Die BC gibt es ja
auch hier. Ja, aber das willst du nicht machen
Also, das willst du nicht meinen. Dann musst du
dich selber über das Öffnen der Connections kümmern.
Vom Ligo-Eltern-Esk-Rate ist okay. Nee, das ist nicht egal.
Das ist eines Datenbank-abhängig, das andere nicht. Also,
wenn die Datenbank nochmal austauschen willst, dann ist es schon noch
ein Unterschied. Also, um die Daten zu wandern.
Ja, das ist getauscht.
Jeden Tag