Diese Episode ist aufgrund aktueller Geschehnisse der letzten beiden Wochen sehr Apple lastig. Damit die Stimmung nicht komplett kippt, besprechen Tom und André jedoch auch Dinge außerhalb des Apple Universums wie beispielsweise das Nexus 5, Windows 10 und -aus der Programmiererecke – Gradle und das Handling von Fehler in AJAX- oder Controller-Aufrufen.
- Breaking Bad
- Fringe
- Modern Family
- Macrumors: iPhone Plus slightly bent after 2 days
- Can skinny jeans bend iPhone Plus?
- Apple Watch debuts in Paris Colette Boutique
- Tim Cook interview with Charlie Rose
- Pushbullet
- Mac OS X 10.10
- Microsoft Windows 10 Announced Officially
- Apple Releases Shellshock Patch
- SPF13 – VIM – .vimrc
- Nexus 5
- Android – Metrics and Grids
- Paintcode App
- SVG-Android
- IntelliJ: Import Gradle Project
- BlackBerry Blend
- BlackBerry Passport Reactions
Bzgl. “schöne” bzw. “richtige” HTTP Status-Codes in Spring MVC Applications: ich verwende da ganz gerne org.springframework.http.ResponseEntity.
ResponseEntity wird von Spring MVC als return type von Controller-Methoden akzeptiert. Für Success und Error Conditions kann man damit recht schön und einfach eine schöne HTTP-Response generieren. Z.B.:
Success (nach einem POST):
new ResponseEntity(MyDTO, HttpStatus.CREATED)
Error:
responseEntity = new ResponseEntity(HttpStatus.BAD_REQUEST);
Ein anderer Weg sind natürlich die mit StatusCodes annotierten Exceptions. Aber man verwendet Exceptions für den normalen Programmfluss, was aus meiner Sicht falsch ist. Web Requests mus man ohnehin als untrusted input behandeln. Insofern ist z.b. ein invalider User-Input nichts was “exceptional” ist. Kommt wohl ein bisschen auf den Fall drauf an.
ja, das mit der ResponseEntity ist auch ein gute Variant, hab ich mir auch schon angesehen.
Das mit den Exceptions widerstrebt mir auch aus dem selben Grund, man soll ja keine Exception für die Steuerung des Programmflusses verwenden. Im Spring Framework werden beide Varianten unterstützt.
Hab grad auch noch einen Post gefunden wo sich jemand über das Thema Gedanken macht: http://blog.codeleak.pl/2013/09/request-body-validation-in-spring-mvc-3.2.html
Zum Thema Gradle Import in IntelliJ:
Viele Entwickler bevorzugen den Import von Projekten in die IDE über einen klicki bunti dialog wie z.B. den von Intellij.
Ich selbst generiere mir die Intellij projekt dateien von der kommandozeile über “gradle idea”.
Hauptsächlich, weil meine Möglichkeiten zur Manipulation der projekt dateien (momentan) eingeschränkt ist und ich keine custom tasks beim Gradle Import über die UI ausführen kann. Das bedeutet, dass es nicht einfach möglich ist sourcen während des Imports zu generieren.
Das Eclipse STS team hat das gelöst, in dem es custom lifecycle tasks zur verfügung stellt an die man sich dann im build script hängen kann. Leider fehlt das bei Idea. Auch in ihrem Forum machen sie keine Aussagen dazu, obwohl das ein sehr gefragtes feature ist.
Generell ermöglicht das Generieren von idea projekt dateien über die Kommandozeile sehr viele Anpassungsmöglichkeiten, da man bis auf xml ebene herabsteigen kann (wenn man will). Im Gradle Open source Projekt zum Beispiel generieren wir neben den üblichen Projekt properties auch “run konfigurationen”, “copyright header setup”, “VCS mappings” und “code style settings”. Das benötigt erstmal etwas Zeit um sich mit dem erwarteten XML auseinanderzusetzen, ist aber eine Prima möglichkeit um eine standardisierte IDE umgebung aufzusetzen. Die Xml manipulation wird beim Gradle Import über ide IDEA UI leider größtenteils ignoriert. Die Idea konfiguration vom Gradle Projekt liegt übrigens hier: https://github.com/gradle/gradle/blob/master/gradle/idea.gradle
Ein paar andere Dinge stören mich noch am aktuellen IntelliJ Gradle import. Unter anderem:
– der default output geht nach “build/classes” was dem Gradle output entspricht. Ich hab das gerne getrennt.
– das Problem, dass das build directory excluded wird hast du ja auch schon bemerkt.
Beides lässt sich durch Änderungen im build file beheben. Im Beispiel Gist unter (https://gist.github.com/breskeby/b6501f69c26660777d17) setze ich den output auf “out” und den test output auf “testout”. Ausserdem
ersetze ich das generelle Exclude vom build directory durch explizitere excludes (Damit wir später auf das “build/generated” verzeichnis zugreifen können):
Zum Thema Language Level:
Das “Project Language Level” wird vom root projekt übernommen. Also sofern im root projekt das “sourceCompatibility” gesetzt ist, wird der wert auch beim Import übernommen.
Falls dein Root Projekt kein Java Projekt ist, kannst du über das Gradle Idea Plugin direkt das language level konfigurieren (siehe https://gist.github.com/breskeby/f2c8a4571640c232235c)
Zum Thema jaxb generierung. Du kannst sehr einfach in Gradle ant tasks (wie zum beispiel xjc) benutzen. Das hat gegenüber dem seperaten build.xml ant file den vorteil, dass du hier inkrementelle builds nutzen kannst (indem du die outputs und inputs korrekt deklarierst) und dass du die jaxb bibliotheken über das dependency management von gradle resolven kannst.
Ich hab mal ein Beispiel build.gradle file unter https://gist.github.com/breskeby/b829eca7c1a37e5e4e05 angelegt. Mit der letzten Zeile “ideaModule.dependsOn generateJaxb” sorge ich dafür dass mir die Jaxb Klassen beim ausführen von “gradle idea” generiert werden.
Hi Rene!
Ich sage jetzt schon mal Danke für deine ausführliche Antwort, echt super Sache! Wir werden uns da natürlich mit ein paar Flattr Klicks bei dir revanchieren. Oder möchtest du lieber Gummibären (kein Scherz)?
LG, André
nicht nötig. ich lern auch jedesmal was neues beim zuhören.
wenn ihr aber drauf besteht dann gummibären. vielleicht sieht man sich ja irgendwann mal wieder auf irgendeiner konferenz. schon nen weilchen her.
ich hab ganz vergessen noch auf das netflix kapitel einzugehen. bei mir viel der netflix start in deutschland und krankheit zusammen, so dass ich mir vom krankenbett aus in drei tagen orange is the new black staffel 1 + 2 gegeben habe, was ich auch wirklich empfehlen.
modern family ist wirklich großartig. falls ihr ein vpn client habt, könnt ihr mal schauen ob in anderen ländern (zum beipiel u.k. oder italien) mehr staffeln zur verfügung stehen. in usa gibt es gar kein modern family soweit ich das in erinnerung habe. Was mir etwas bei Netflix fehlt ist die Möglichkeit etwas mit 1.5x Geschwindigkeit zu schauen. (war bei LOST unbedingt nötig). Aber als ich bei Netflix mal nachgefragt habe, meinten Sie, dass wenn wir die Gradle Geschwindigkeit genauso erhöhen könnten, sprechen wir noch mal drüber.
Aber genug jetzt, ich muss Fargo schauen…
Hallo Rene, muss mich auch mal bedanken – spitzen Antworten, danke! Bin leider noch nicht dazugekommen sie umzusetzen, aber ich werden dir dann die Fortschritte schildern 😉
Ich kann “Ripper Street” empfehlen, hab ich auch nur durch Netflix kennengelernt. Und als DC Fan natürlich “Arrow” 😉
SVG ist sowieso Hammer… wir haben im Moment *alles* auf SVG.
wir haben jetzt gerade begonnen PDFs in iOS apps einzubauen, die werden dann beim build zwar in pixelgrafiken umgewandet – aber besser als alles manuell in 3 Grössen zu machen
Hi, hab die Episode erst heute gehört … bin gerade am Aufholen ;-).
Vor kurzem hat Martin Fowler zum Thema Verwendung von Exceptions in Validierung folgenden Blogpost geschrieben: http://martinfowler.com/articles/replaceThrowWithNotification.html