BeanInfo-Generierung via Annotations

vorhergehende Artikel in: Java Komponenten OpenSource
05.01.2018

Nachdem ich mich von Netbeans als IDE losgesagt und Idea in der Community Edition zugewandt habe, vermisste ich eigentlich nur eins: den schönen clicky-bunty-Editor für BeanInfo-Klassen. Daher die Idee, so etwas über Annotations zu realisieren...

Die bisherige Lösung dafür war eher eine Krücke - sie erzeugte zwar eine BeanInfo-Klasse, allerdings war diese nur wenig mehr als ein Skelett. Danach war noch einige Handarbeit angesagt, damit eine sinnvolle BeanInfo daraus wurde. Aber noch erschwerender war sicher die Tatsache, dass man eine einmal generierte und angepasste BeanInfo davor schützen musste, dass noch einmal "drüber generiert" wird - dadurch wären nämlich alle Anpassungen verlorengegangen.

Das ist besonders in Fällen hinderlich, in denen einer Bean neue Properties hinzugefügt werden: Dann muss man entweder die bestehende BeanInfo doch von Hand weiterpflegen oder nochmals generieren und darauf hoffen, dass man die händisch vorgenommenen Anpassungen durch ein kompetentes Merge-Werkzeug in die neue BeanInfo übernehmen kann.

Das Ziel musste also sein, die BeanInfo-Annotations so zu erweitern, dass alle Aspekte in einer BeanInfo-Klasse über Annotations abbildbar waren. Diese Aspekte mussten dann in einem weitaus umfassenderen Velocity-Template berücksichtigt und umgesetzt werden. Damit erübrigt sich jegliche Anpassung der generierten BeanInfo.

Damit dies wirklich so bleibt, wurde ein wenig weiter gedacht: Die BeanInfos sind inhärent multilingual: Es ist möglich, ein ResourceBundle anzugeben, das in der generierten BeanInfo benutzt wird. An allen Stellen, an denen ein String erwartet wird, kann per Annotation-Attribut auch ein String genutzt werden, der ein gültiges Java-Quelltextfragment darstellt und nach Auswertung einen String ergibt. Bestes Beispiel dafür ist die Internationalisierung: statt "huhu" kann man einfach schreiben:

i18n.getString("huhu");

Dieser Code wird an der entsprechenden Stelle in die BeanInfo generiert und erzeugt dann einen String, statt das vorgegebene StringLiteral nutzen zu müssen.

Eine weitere Facette dient der Abrundung: In einigen Positionen der BeanInfo-Klasse ist ein Exception-Handling nötig: dafür existiert ein weiteres Annotation-Attribut, das ebenfalls wieder ein gültiges Java-Quelltextfragment enthalten muss - in diesem Fall wird es statt des Standard-Exception-Handling eingesetzt.

Alle benötigten Klassen und Ressourcen werden in einem Github-Repository veröffentlicht werden.

Ein Ausblick sei an dieser Stelle noch gestattet: Es wäre schön, wenn man aus den Annotations Runtime-Annotations machen könnte: dann wäre es möglich, ohne BeanInfo generieren zu müssen die BeanInfo über eine Introspector-Fassade direkt zur Laufzeit zu erzeugen.

Aktualisierung vom 5. Januar 2018

Das versprochene GitHub-Repository wurde eingerichtet.

Artikel, die hierher verlinken

BeanInfo durch Runtime-Annotations feature-complete und in Bälde Open Source

12.11.2023

Ich habe vor geraumer Zeit laut darüber nachgedacht, dass die Realisierung der BeanInfos in einer separaten Klasse zu aufwendig und fehleranfällig ist. Ich habe dann zunächst eine Variante implementiert, bei der die BeanInfo nicht mehr manuell gepflegt werden musste, sondern aus Annotations generiert wurde.

Maven-Archetype für dWb+ Module

16.04.2018

Nachdem ich bereits ein GitHub-Repository für die Beispiele aus dem Kochbuch für dWb+ veröffentlicht habe, folgt nun hier ein Archetype zur entwicklung eigener Module

BeanInfo durch Runtime-Annotations

12.02.2018

Wie bereits in einem früheren Artikel ausgeführt wollte ich untersuchen, ob es möglich wäre, BeanInfos per Annotations bereitzustellen, die über eine Fassade direkt zur Laufzeit ermittelt werden könnten, ohne explizite BeanInfo-Klassen zu benötigen

GitHub Repository für BeanInfo Generator

21.01.2018

Wie bereits in einem früher veröffentlichten Artikel angekündigt wurden die Dateien zur Erzeugung vollständiger BeanInfos in einem GitHub-Repository veröffentlicht.

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.