{"id":697,"date":"2026-06-21T23:32:36","date_gmt":"2026-06-21T22:32:36","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=697"},"modified":"2026-07-07T23:33:01","modified_gmt":"2026-07-07T22:33:01","slug":"string-templates-in-java-21-typsichere-string-interpolation-und-sql-sicherheit","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=697","title":{"rendered":"String Templates in Java 21 \u2013 Typsichere String-Interpolation und SQL-Sicherheit"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Java war lange die Sprache, in der man f\u00fcr formatierte Strings&nbsp;<code>String.format()<\/code>&nbsp;oder umst\u00e4ndliche&nbsp;<code>+<\/code>-Ketten schreiben musste. Mit Java 21 (JEP 430) kam endlich eine elegante L\u00f6sung:&nbsp;<strong>String Templates<\/strong>. Dieser Artikel zeigt die Syntax, erkl\u00e4rt eigene Template-Prozessoren und demonstriert, wie String Templates SQL-Injection-Angriffe zur Compile-Time verhindern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig vorab: String Templates sind in Java 21 (JEP 430) und 22 (JEP 459) ein&nbsp;<strong>Preview-Feature<\/strong>. Die f\u00fcr JDK 23 geplante Finalisierung (JEP 465) wurde zur\u00fcckgezogen (Status:&nbsp;<strong>Withdrawn<\/strong>). Das Feature ist daher ab JDK 23 nicht mehr verf\u00fcgbar und befindet sich im Redesign. Mit JDK 21\/22 und&nbsp;<code>--enable-preview<\/code>&nbsp;ist es weiterhin nutzbar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Grundlagen: STR und FMT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Basis-Syntax ist&nbsp;<code>PROZESSOR.\"Text \\{ausdruck}\"<\/code>&nbsp;\u2014 der Template-Prozessor&nbsp;<code>STR<\/code>&nbsp;ersetzt&nbsp;<code>\\{...}<\/code>&nbsp;mit dem Ergebnis des Ausdrucks:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">String<\/span> name = <span class=\"hljs-string\">\"Lena\"<\/span>;\nint bestellungen = <span class=\"hljs-number\">42<\/span>;\n\n<span class=\"hljs-built_in\">String<\/span> nachricht = STR.<span class=\"hljs-string\">\"Hallo \\{name}, du hast \\{bestellungen} Bestellungen.\"<\/span>;\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ \"Hallo Lena, du hast 42 Bestellungen.\"<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Ausdr\u00fccke sind vollst\u00e4ndig: Methodenaufrufe, Arithmetik, sogar andere Templates<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<span class=\"hljs-built_in\">String<\/span> info = STR.<span class=\"hljs-string\">\"Summe: \\{bestellungen * 2 + 10}\"<\/span>;\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ \"Summe: 94\"<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Der&nbsp;<code>FMT<\/code>-Prozessor kombiniert Templates mit&nbsp;<code>java.util.Formatter<\/code>-Spezifikationen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">record Produkt(String name, double preis) {}\n\nProdukt&#91;] produkte = {\n    <span class=\"hljs-keyword\">new<\/span> Produkt(<span class=\"hljs-string\">\"Tastatur\"<\/span>, <span class=\"hljs-number\">89.99<\/span>),\n    <span class=\"hljs-keyword\">new<\/span> Produkt(<span class=\"hljs-string\">\"Monitor\"<\/span>, <span class=\"hljs-number\">349.00<\/span>),\n    <span class=\"hljs-keyword\">new<\/span> Produkt(<span class=\"hljs-string\">\"Maus\"<\/span>, <span class=\"hljs-number\">24.50<\/span>)\n};\n\nString tabelle = FMT.<span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n    %-15s\\{produkte&#91;0].name}  %8.2f\\{produkte&#91;0].preis}\n    %-15s\\{produkte&#91;1].name}  %8.2f\\{produkte&#91;1].preis}\n    %-15s\\{produkte&#91;2].name}  %8.2f\\{produkte&#91;2].preis}\n    \"<\/span><span class=\"hljs-string\">\"\"<\/span>;\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ Tastatur           89.99&lt;\/em&gt;<\/span>\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ Monitor           349.00&lt;\/em&gt;<\/span>\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ Maus               24.50&lt;\/em&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Text Blocks (<code>\"\"\"<\/code>) und Templates erg\u00e4nzen sich perfekt f\u00fcr mehrzeilige Strings:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">String json = STR.<span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n    {\n        \"<\/span>name<span class=\"hljs-string\">\": \"<\/span>\\{name}<span class=\"hljs-string\">\",\n        \"<\/span>bestellungen<span class=\"hljs-string\">\": \\{bestellungen}\n    }\n    \"<\/span><span class=\"hljs-string\">\"\"<\/span>;\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">RAW: Zugriff auf unverarbeitete Templates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der&nbsp;<code>RAW<\/code>-Prozessor liefert ein&nbsp;<code>StringTemplate<\/code>-Objekt zur\u00fcck:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">int x = <span class=\"hljs-number\">10<\/span>, y = <span class=\"hljs-number\">20<\/span>;\nStringTemplate st = RAW.<span class=\"hljs-string\">\"\\{x} plus \\{y} gleich \\{x + y}\"<\/span>;\n\nst.fragments();  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ &#91;\"\", \" plus \", \" gleich \", \"\"]<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\nst.values();     <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ &#91;10, 20, 30]<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wichtig:&nbsp;<code>RAW<\/code>&nbsp;produziert absichtlich&nbsp;<strong>keinen<\/strong>&nbsp;<code>String<\/code>&nbsp;\u2014 du musst das Template immer explizit durch einen Prozessor schicken, bevor ein String entsteht. Das verhindert versehentliche, ungepr\u00fcfte Interpolation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SQL-Injection mit String Templates verhindern<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Beispiel zeigt, warum String Templates f\u00fcr Datenbankzugriffe so wertvoll sind. Angenommen, ein Angreifer gibt diesen Suchtext ein:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">String<\/span> suchbegriff = <span class=\"hljs-string\">\"M\u00fcller' OR 1=1 --\"<\/span>;\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Gef\u00e4hrliche String-Konkatenation:<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<span class=\"hljs-built_in\">String<\/span> unsafe = <span class=\"hljs-string\">\"SELECT * FROM kunden WHERE name = '\"<\/span> + suchbegriff + <span class=\"hljs-string\">\"'\"<\/span>;\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Ergebnis: SELECT * FROM kunden WHERE name = 'M\u00fcller' OR 1=1 --'<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ -&gt; Gibt ALLE Datens\u00e4tze zur\u00fcck!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Ein eigener Template-Prozessor ersetzt&nbsp;<code>\\{...}<\/code>-Stellen mit JDBC-<code>?<\/code>-Platzhaltern und \u00fcbergibt die Werte sicher via&nbsp;<code>PreparedStatement<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import java.sql.*;\n\nrecord QueryProcessor(Connection conn)\n    implements StringTemplate.Processor&lt;PreparedStatement, SQLException&gt; {\n\n    <span class=\"hljs-keyword\">public<\/span> PreparedStatement process(StringTemplate st) throws SQLException {\n        String query = String.join(<span class=\"hljs-string\">\"?\"<\/span>, st.fragments());\n\n        PreparedStatement ps = conn.prepareStatement(query);\n        int index = <span class=\"hljs-number\">1<\/span>;\n        <span class=\"hljs-keyword\">for<\/span> (Object value : st.values()) {\n            <span class=\"hljs-keyword\">switch<\/span> (value) {\n                <span class=\"hljs-keyword\">case<\/span> Integer i  -&gt; ps.setInt(index++, i);\n                <span class=\"hljs-keyword\">case<\/span> Long l     -&gt; ps.setLong(index++, l);\n                <span class=\"hljs-keyword\">case<\/span> Double d   -&gt; ps.setDouble(index++, d);\n                <span class=\"hljs-keyword\">case<\/span> Boolean b  -&gt; ps.setBoolean(index++, b);\n                <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-keyword\">null<\/span>       -&gt; ps.setNull(index++, Types.<span class=\"hljs-keyword\">NULL<\/span>);\n                <span class=\"hljs-keyword\">default<\/span>         -&gt; ps.setString(index++, value.toString());\n            }\n        }\n        <span class=\"hljs-keyword\">return<\/span> ps;\n    }\n}\n\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ Verwendung:&lt;\/em&gt;<\/span>\n<span class=\"hljs-keyword\">var<\/span> DB = <span class=\"hljs-keyword\">new<\/span> QueryProcessor(connection);\nPreparedStatement stmt = DB.<span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n    SELECT * FROM kunden WHERE name = \\{suchbegriff}\n    \"<\/span><span class=\"hljs-string\">\"\"<\/span>;\nResultSet rs = stmt.executeQuery();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Selbst mit b\u00f6sartigem Input \u2014&nbsp;<code>M\u00fcller' OR 1=1 --<\/code>&nbsp;\u2014 entsteht daraus:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">SELECT * FROM kunden WHERE name = ?\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">mit&nbsp;<code>suchbegriff<\/code>&nbsp;als gebundenem Parameter. Keine SQL-Injection m\u00f6glich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eigener Template-Prozessor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Interface ist einfach:&nbsp;<code>StringTemplate.Processor&lt;R, E&gt;<\/code>.&nbsp;<code>R<\/code>&nbsp;ist der R\u00fcckgabetyp,&nbsp;<code>E<\/code>&nbsp;die m\u00f6gliche Exception. Hier ein Prozessor, der JSON produziert und gleichzeitig auf Injection pr\u00fcft:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">StringTemplate.Processor&lt;String, IllegalArgumentException&gt; JSON =\n    st -&gt; {\n        String quote = <span class=\"hljs-string\">\"\\\"\"<\/span>;\n        <span class=\"hljs-keyword\">for<\/span> (Object value : st.values()) {\n            <span class=\"hljs-keyword\">if<\/span> (value <span class=\"hljs-keyword\">instanceof<\/span> String s &amp;&amp; s.contains(quote)) {\n                <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException(\n                    <span class=\"hljs-string\">\"String-Wert enth\u00e4lt Anf\u00fchrungszeichen: \"<\/span> + s);\n            }\n        }\n        <span class=\"hljs-keyword\">List<\/span>&lt;Object&gt; safeValues = <span class=\"hljs-keyword\">new<\/span> ArrayList&lt;&gt;();\n        <span class=\"hljs-keyword\">for<\/span> (Object v : st.values()) {\n            <span class=\"hljs-keyword\">if<\/span> (v <span class=\"hljs-keyword\">instanceof<\/span> String s) {\n                safeValues.add(quote + s + quote);\n            } <span class=\"hljs-keyword\">else<\/span> {\n                safeValues.add(v);\n            }\n        }\n        <span class=\"hljs-keyword\">return<\/span> StringTemplate.interpolate(st.fragments(), safeValues);\n    };\n\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ Nutzung:&lt;\/em&gt;<\/span>\nString person = <span class=\"hljs-string\">\"Lena\"<\/span>;\nint alter = <span class=\"hljs-number\">30<\/span>;\nString result = JSON.<span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\n    {\"<\/span>name<span class=\"hljs-string\">\": \\{person}, \"<\/span>alter<span class=\"hljs-string\">\": \\{alter}}\n    \"<\/span><span class=\"hljs-string\">\"\"<\/span>;\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ {\"name\": \"Lena\", \"alter\": 30}&lt;\/em&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Preview-Feature aktivieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr Java 21 oder 22 mit&nbsp;<code>--enable-preview<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">javac<\/span> <span class=\"hljs-selector-tag\">--enable-preview<\/span> <span class=\"hljs-selector-tag\">--release<\/span> 21 <span class=\"hljs-selector-tag\">MeinProgramm<\/span><span class=\"hljs-selector-class\">.java<\/span>\n<span class=\"hljs-selector-tag\">java<\/span> <span class=\"hljs-selector-tag\">--enable-preview<\/span> <span class=\"hljs-selector-tag\">MeinProgramm<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In Maven:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.apache.maven.plugins<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>maven-compiler-plugin<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">compilerArgs<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">arg<\/span>&gt;<\/span>--enable-preview<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">arg<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">compilerArgs<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die f\u00fcr JDK 23 geplante Finalisierung der String Templates (JEP 465) wurde zur\u00fcckgezogen (Status: Withdrawn). Die enge Kopplung von Template-Erfassung und -Verarbeitung in der Syntax&nbsp;<code>PROZESSOR.\"template\"<\/code>&nbsp;galt als problematisch. Stand Juli 2026 gibt es noch keinen Nachfolge-JEP; ein Redesign mit m\u00f6glicherweise getrennten Schritten f\u00fcr Capture und Processing wird in der Community diskutiert. In der Zwischenzeit bleibt JDK 21\/22 die einzige M\u00f6glichkeit, mit dieser Preview zu experimentieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die grundlegende Idee \u2014 typsichere, validierbare String-Interpolation mit anwendungsspezifischen Prozessoren \u2014 bleibt relevant, auch wenn das finale Design noch offen ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java war lange die Sprache, in der man f\u00fcr formatierte Strings&nbsp;String.format()&nbsp;oder umst\u00e4ndliche&nbsp;+-Ketten schreiben musste. Mit Java 21 (JEP 430) kam endlich eine elegante L\u00f6sung:&nbsp;String Templates. Dieser Artikel zeigt die Syntax, erkl\u00e4rt eigene Template-Prozessoren und demonstriert, wie String Templates SQL-Injection-Angriffe zur Compile-Time verhindern. Wichtig vorab: String Templates sind in Java 21 (JEP 430) und 22 (JEP [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-697","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/697","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=697"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/697\/revisions"}],"predecessor-version":[{"id":698,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/697\/revisions\/698"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}