Spring Data JPA: Subqueries

JPQL-Subqueries können nicht im FROM stehen – aber Native Queries haben diese Einschränkung nicht:

Ajax Interceptor mit jQuery und Angular

jQuery:

Angular:

Für die CSRF-Token siehe hier.

Spring: Dependency Injection in statische Variablen

Es gibt n+1 Artikel, warum das architektonisch keinen Sinn ergeben würde – aber wenn man das trotzdem möchte, findet sich hier die Lösung (leicht abgewandelt, zB ist der Setter privat), die keine Konstruktor-Parameter erfordert:

PS: Der Setter wird nur beim Startup aufgerufen, und nicht mit jedem Bean, insofern entsteht dadurch kein Performance-Issue.

PPS, Achtung: Dieser Kommentar hat recht, deshalb Vorsicht! Ggf. sollte das Feld transient sein

ungetestete Alternative

via:

Öfter mal was Neues: Neuer Job

(Zu Folge 4)

Zum ersten mal überhaupt seit Bestehen dieses Blogs (immerhin Mitte 2008!) habe ich den Job gewechselt: Seit 1.11. arbeite ich nicht mehr bei Jung von Matt/next, sondern bei mindsmash.

Bei der next hatte sich mein Job über die Jahre stark gewandelt: Eingestellt als Web Developer war ich fast von Beginn an der Flash Developer, der ich mich dann auch bald nennen durfte. Darin brachte ich es bis zum Senior; aber als Flash dann starb, war ich tatsächlich gerade mit einem komplexen Java-Projekt beschäftigt. Java-Projekte sind im Werbeagenturumfeld eher selten, das zweite Standbein wurde deshalb PHP, und ich zum Application Developer. Java blieb trotzdem das Wunschziel, und bei mindsmash bin ich dann auch “Java Web Developer”.

Was das Ganze mit diesem Blog zu tun hat: Es dürften vermehrt Java-Posts folgen* – embrace yourself!

*ein paar kamen ja schon.

PS, die Aussicht aus’m Büro nach hinten raus:

Morgens auf dem Raucherbalkon - schade, dass ich nicht rauche. #newoffice

PPS: Darum geht’s:

Spring Boot Security: 403 Forbidden

Es gibt durchaus gute Tutorials und Examples für Spring Boot Security. Nur benutzen die alle Thymeleaf als Templating Engine. Und Thymeleaf hat eine Besonderheit: Wenn man im Form “th:action” statt “action” verwendet, dann wird automatisch ein hidden Input Field mit dem CSRF-Token injected!

Wenn man stattdessen bsplw. Velocity verwendet, und das Template 1:1 übersetzt, merkt man nicht, dass etwas fehlt m( Der Server gibt “403 Forbidden” ohne weitere Fehlermeldung zurück (Tipp zum Debuggen: Der Request wird irgendwann auf die Error-Route umgebogen, aber der Fehler (hier noch inklusive Fehlermeldung) steht im Response-Object).

Offenbar muss man den Token dann manuell dem Template übergeben (Quelle, weicht aber leicht ab):

Gegenprobe:

Update

Übrigens: Hier wird beschrieben, wie man in Thymeleaf den Token in jeden Ajax-Request bekommt. Leider funktioniert das so nicht, denn um den Platzhalter zu ersetzen, muss man th:content verwenden (Quelle indirekt), sonst wird der Platzhalter nicht ausgewertet m(

Dann: Siehe hier für das Absetzen der Requests (in jQuery oder Angular)

Spring Boot: @Controller vs @RestController

@RestController ist eine Abkürzung für @Controller und @ResponseBody – und @ResponseBody gibt die Rückgabe eines Controllers direkt aus. Nachteil: Views werden nicht mehr automatisch aufgelöst; der View-Name wird direkt an den Browser geschickt.

Dafür übersetzen @RestController (serialisierbare) Objekte direkt in JSON, auch praktisch – und einfach nachzurüsten für @Controller: Einfach jede entsprechende Methode separat mit @ResponseBody annotieren.

Maven: Sourcen runterladen

Ein Projekt für die IDE aufbereiten geht bekanntermaßen (hier für Eclipse) über

Mit dem kleinen Parameter -DdownloadSources werden dabei auch die Sourcen geladen:

Das funktioniert auch nachträglich, die Projekt-Datei wird dann neu geschrieben. Eventuell ist dann ein Refresh nötig.

In dem Zusammenhang: Es gibt eine zentrale Suche für Maven: http://search.maven.org/