SpringBoot – Controller erstellen mit JSON-Rückgabe und Standard-HTTP-code

Es ist einfach befreiend zu sehen wie einfach in einem SpringBoot-Umfeld die Webentwicklung ist:


@Controller
@RequestMapping("/foobar")
final class FooBarController {

@Inject
private FooBar fooBar;

/**
* @return the currently set {@link FooBar}.
*/
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity parseInvocationContext() {
return new ResponseEntity(fooBar.toString(), HttpStatus.OK);
}

}

Die Methode gibt mit einem 200er einfach ein Statusobjekt zurück und kann dieses ganz einfach als JSON anzeigen.

Java SDK Mac finden und einrichten in IntelliJ

Java-Einrichtung

Um die neue IntelliJ-Version an den Start zu bringen, muss man ja wissen, wo auf dem Mac das installierte Java liegt – nach ein wenig Suchen findet IntelliJ ein JDK unter:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

Das als globale Bibliothek / SDK einrichten und schon verschwinden die Syntaxfehler 🙂

Einstellungen in IntelliJ

  • Settings -> Editor -> Appearance: show line numbers
  • File -> Project Structure, dort: SDKs – Add – Java SDK (Werte siehe oben)
  • Settings -> File encodings: UTF-8 (IDE Encoding)

Basierend auf diesen Informationen müssen auch die Einstellungen im Terminal entsprechend vorgenommen werden – dazu einfach in der .profile-Datei:

export JAVA_HOME=`/usr/libexec/java_home`

und schon hat man stets den Verweis auf das System-Java.

Eclipse Indigo einrichten – SVN/Maven

Die Zwischenzeit konnte ich nutzen, um meine virtuelle Maschine und das Äpfelchen auf den aktuellsten Stand zu bringen.

Um ins SVN der Firma zu kommen, muss wieder ein wenig manuell nachgearbeitet werden.

Zuerst das aktuelle 4.4/Luna-Eclipse runterziehen:

  • Eclipse Luna 4.4 – Standard
  • Eclipse Luna 4.4 – JavaDevelopers

Dann noch Subversion installieren:

  • Mac: Collab.net-Gedöns installieren – man muss sich leider anmelden
  • Ubuntu: aptitude install subversion libsvn-java

Eclipse-Plugins installieren

Über den Eclipse-Marktplatz die folgenden Plugins nachinstallieren und dann jeweils Eclipse neu starten:

  • Subclipse (Tigris) – SVN-Provider (nicht: Subversion nehmen sonst kommt alles durcheinander)
  • M2 – Maven2Eclipse – Eclipse-Maven-Integration
  • Maven Development Tools
  • Moreunit
  • EclEmma
  • EGit
  • Gradle

Eclipse-Konfiguration nachziehen

Die JavaHL-Bibliothek liegt nicht an Standardpfaden, weshalb die Eclipse-Konfigurationsdatei eclipse.ini angepasst werden muss – die Zeile muss eingefügt werden:

  • Mac: -Djava.library.path=/opt/subversion/lib
  • Ubuntu: -Djava.library.path=/usr/lib/jni

Sobald die Konfig nachgezogen ist, sieht man bei einem Neustart im Einstellungsfenster zu Team/SVN, dass JavaHL zur Auswahl steht. Dann funzt alles.

Ansonsten nicht vergessen, dass das Repo mit svn+ssh in der URL eingebunden werden muss.

So – nun also mit der neuen Version am Start und ready 2 rumble 🙂

Die Alternative mittels MacPorts die Bindings sowie eine aktuelle SVN-Version auf dem Mac zu installieren haben nicht funktioniert, weil MacPorts mit Schmerzen abbrach.

Hilfereiche Links sind ebenfalls:

Reguläre Ausdrücke

Kommt ja immer wieder im Alltag vor, deshalb hier ein paar Links zur allgemeinen Ablage zum Thema in bezug auf Groovy und Java selbst:

Viel Spaß damit. Ursprünglich begann alles mit regulären Ausdrücken, um Wortfetzen in Webseitentexten zu finden und umliegendes HTML zu entfernen:

1. .*CEO.?< ?[<>/a-zA-Z]*>{1}([\w ]*).* filtert Dir alles weg was Tags nach CEO enthält und gibt Dir in $1 (Gruppe 1) den Namen zurück
wenn das Ergebnis leer ist (weil z.b. zwischen CEO und dem Namen keine Tags sind)

2. .*CEO.?([\w ]*).* filtert Dir alles bis zu dem Text nach CEO: weg und gibt dir die darauf folgenden word characters zurück und schneidet den Balast danach weg

Keychain – bequemes Starten in allen Konsolen

Oftmals benötigt man ja bestehende SSH- oder GPG-Agenten, um als Entwickler bequem auf Repositories zugreifen zu könne. Eine minimalinvasive Systemintegration will her – hier eine Integration in die .bashrc:

keychain
. "$HOME/.keychain/HIER_KOMMT_DER_RECHNERNAME_REIN-sh"
ssh-add -l &>/dev/null || ssh-add

Dann kann man schnell beliebige Konsolen starten oder Konsolentabs öffnen und muss nicht seine SSH-Passwörter eingeben. Dies ist nur 1x beim initialien Anmelden ans System nötig.

Aber: manche Ubuntuversionen starten bereits bei jeder bestehenden X-Session einen SSH-agent, der dann zu Ärger führen kann.

Schnittstellen – und daran kann man sich festhalten

Tja – die alte Softwareentwicklermär: Schnittstellen sind fix und daher ist es unerheblich, welche konkrete Softwareversion am Start ist. Weit gefehlt!

Im JDK – trotz stabiler Schnittstelle der 6er Version – scheint es zwischen den Minoversionen einen kleinen, aber entscheidenden Unterschied zu geben. Dieser wurde kürzlich durch Sportsfreund Hudson aufgedeckt.

Lokal liefen alle Tests durch, aber auf dem Hudson meinte der URLEncoder, dass er einige Sachen nicht rausfiltern will – hauptsächlich das Paragraphenzeichen. Naja – aber wie findet man nun raus welche JDK-Version dort am Start ist?

Eine übliche Suchmaschinenanfrage bringt nur diverse Verweise auf – ruf doch bitte java –version auf. Aber das hilft ja nicht im Programm. Dann meinte ein Kollege, dass es da so eine Systemproperty gäbe.

Aber wie heißt selbige – lange Suche brauchte diesen Artikel zutage.

Und so sieht das ganze für die Hosentasche aus:

String javaVersion = System.getProperty("java.version");

Happy bug hunting!

Autowired by name mit JUnit4 und Spring

Dieses JUnit4 ist einfach Klasse – keine unnützen setter mehr, die den Code verunreinigen und Tests lassen sich einfach durch Entfernen der @Test-Annotation ausschalten.

Neben dem ganz normalen Verdrahten der Beans per Beantyp ist manchmal das Verdrahten per Beanname nötig, was wie folgt umzusetzen ist:

@Autowired
@Qualifier("applicationPrefixTestMagicMemberComponenten")
private MockMagicComponenten memberComponent;

Diese Annotationen machen einfach Spass 🙂

Am Kopf der Klasse dazu fix den ApplicationContext verdrahtet:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:myApplicationTestContext.xml"})
public class ExampleTest {

Setup-Methoden zur Erzeugung der Daten werden mit @Before markiert, während die Löschmethoden mittels @After markiert sind.