{"id":1962,"date":"2013-03-02T15:01:16","date_gmt":"2013-03-02T14:01:16","guid":{"rendered":"https:\/\/sgaul.de\/?p=1962"},"modified":"2014-03-13T21:34:45","modified_gmt":"2014-03-13T20:34:45","slug":"compiler-sicherheit-fur-wicket-bindgen-und-wicket-id-bindings-generator","status":"publish","type":"post","link":"https:\/\/sgaul.de\/2013\/03\/02\/compiler-sicherheit-fur-wicket-bindgen-und-wicket-id-bindings-generator\/","title":{"rendered":"Compiler-Sicherheit f\u00fcr Wicket: Bindgen und Wicket-ID-Bindings-Generator"},"content":{"rendered":"
Eine zentrale Schwachstelle von Apache Wicket<\/a> ist die fehlende Sicherheit zur \u00dcbersetzungszeit. Viele Dinge werden als Strings angegeben, so dass simple Tippfehler erst zur Laufzeit und somit schlimmstenfalls erst beim Kunden auffallen. Betroffen sind vor allem drei Bereiche:<\/p>\n <\/p>\n F\u00fcr das Model-Problem gibt es mit Bindgen Wicket<\/a> eine verh\u00e4ltnism\u00e4\u00dfig prominente L\u00f6sung. Hier wurde bereits angefragt<\/a>, ob das Tool nicht offizieller Teil von Wicket 7 werden k\u00f6nnte.<\/p>\n Bindgen ist ein Annotation Processing Tool<\/a>. Es erzeugt Meta-Klassen, welche die vom Nutzer geschriebenen Klassen und deren Eigenschaften beschreiben. Property-Models k\u00f6nnen somit compilersicher beschrieben werden:<\/p>\n Kein wackliger String, sondern sichere, generierte Bindingklassen, welche die Attribute der Basisklasse beschreiben.<\/p>\n Annotationprocessing ist mittlerweile fester Bestandteil moderner IDEs, so dass Bindgen nach der einmaligen Einrichtung in etwa Eclipse keiner weiteren Interaktion bedarf. Die Bindings werden stets automatisch aktualisiert.<\/p>\n Von Bindgen inspiriert, hat Ole Langbehn eine analoge L\u00f6sung f\u00fcr Property-Dateien und HTML-Templates geschaffen.<\/p>\n Das offizielle Repository auf Github ist momentan nicht mit Wicket > 1.4 kompatibel. Eine Variante f\u00fcr neuere Versionen habe ich in meinem Fork bereitgestellt: <\/p>\n Ole hat angedeutet die \u00c4nderungen zu \u00fcbernehmen, so dass die Updates auch bald im offiziellen Repo zu finden sein sollten.<\/p>\n Die Autovervollst\u00e4ndigung nimmt nun noch mehr Arbeit ab und eine potentielle Fehlerquelle ist eliminiert. Bleibt nur noch zu hoffen, dass Wicket diese oder \u00e4hnliche L\u00f6sungen zuk\u00fcnftig schon von Haus aus mitbringt. <\/p>\n","protected":false},"excerpt":{"rendered":" Eine zentrale Schwachstelle von Apache Wicket ist die fehlende Sicherheit zur \u00dcbersetzungszeit. Viele Dinge werden als Strings angegeben, so dass simple Tippfehler erst zur Laufzeit und somit schlimmstenfalls erst beim Kunden auffallen. Betroffen sind vor allem drei Bereiche: PropertyModels, in denen Objektattribute als Strings notiert werden: new PropertyModel<String>(person, „name“); Wicket-ID-Referenzen, die Komponenten mit ihrem Template… Compiler-Sicherheit f\u00fcr Wicket: Bindgen und Wicket-ID-Bindings-Generator<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":1981,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[91],"tags":[6,527,525],"_links":{"self":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/1962"}],"collection":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/comments?post=1962"}],"version-history":[{"count":21,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/1962\/revisions"}],"predecessor-version":[{"id":2500,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/posts\/1962\/revisions\/2500"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/media\/1981"}],"wp:attachment":[{"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/media?parent=1962"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/categories?post=1962"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sgaul.de\/wp-json\/wp\/v2\/tags?post=1962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}\n
new PropertyModel<String>(person, \"name\");<\/pre>\n<\/li>\n
<span wicket:id=\"myLabel\"><\/span> <-> new Label(\"myLabel\")<\/pre>\n<\/li>\n
new StringResourceModel(\"page.welcome\", this, null);<\/pre>\n<\/li>\n<\/ul>\n
Bindgen f\u00fcr Wicket<\/h2>\n
<\/a>
\/\/ ohne Bindgen:\r\nPropertyModel<String>(person, \"name\"<\/strong>);\r\n\r\n\/\/ mit Bindgen:\r\nBindingModel.of(person, new PersonBinding().name()<\/strong>);\r\n\r\n\/\/ auch \u00fcber Objektgrenzen hinweg:\r\nBindingModel.of(person, new PersonBinding().address().street()<\/strong>);<\/pre>\n
\n
Wicket-ID-Bindings-Generator f\u00fcr Property-Dateien und HTML-Templates<\/h2>\n
\/\/ WelcomePage.html\r\n<h1 wicket:id=\"heading\"<\/strong>><\/h1>\r\n\r\n\/\/ WelcomePage_de.properties.xml:\r\n<entry key=\"greetings\"<\/strong>>Willkommen<\/entry>\r\n\r\n\/\/ ohne Wicket-ID-Bindings-Generator\r\nadd(new Label(\"heading\"<\/strong>, \r\n new StringResourceModel(\"greetings\"<\/strong>, this, null));\r\n\r\n\/\/ mit\u00a0Wicket-ID-Bindings-Generator\r\nadd(new Label(WelcomePageWID.heading<\/strong>,\r\n new StringResourceModel(WelcomePageI18n.greetings<\/strong>, this, null));<\/pre>\n
\n