Thymeleaf传递含空格文本报错,无空格文本正常问题求助
问题描述
传递无空格文本(如tech)时系统运行正常,但传递含空格文本(如tech life)时,Thymeleaf出现解析错误。
相关代码片段
<span th:if="${toTimestamp == null && fromTimestamp == null}"> <a class="btn btn-link" th:with="search=${search}" th:href="@{/feed(page=1, sortDirection=${sortDirection == 'asc' ? 'desc' : 'asc'}, author=${checkedAuthors}, tag=${checkedTags}, __(${#strings.isEmpty(search)} ? '' : ('search=' + ${search}))__)}"> Sort by Published Date</a> </span>
报错信息
Caused by: org.attoparser.ParseException: Could not parse as expression: "@{/feed(page=1, sortDirection=${sortDirection == 'asc' ? 'desc' : 'asc'}, author=${checkedAuthors}, tag=${checkedTags}, __(${#strings.isEmpty(search)} ? '' : ('search=' + ${search}))__)}" (template: "blog/feed" - line 141, col 16) at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393) at org.attoparser.MarkupParser.parse(MarkupParser.java:257) at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230) ... 48 more
解决方案
问题根源在于手动拼接URL参数的方式:当search包含空格时,拼接的字符串会破坏Thymeleaf URL表达式的语法,且无法自动处理URL编码。
正确的做法是直接将search作为参数加入URL表达式的参数列表,Thymeleaf会自动处理参数的存在性(空值时不会添加该参数)和URL编码:
<span th:if="${toTimestamp == null && fromTimestamp == null}"> <a class="btn btn-link" th:href="@{/feed(page=1, sortDirection=${sortDirection == 'asc' ? 'desc' : 'asc'}, author=${checkedAuthors}, tag=${checkedTags}, search=${search})}"> Sort by Published Date</a> </span>
如果需要严格判断search不为空才添加参数,也可以用条件表达式:
<span th:if="${toTimestamp == null && fromTimestamp == null}"> <a class="btn btn-link" th:href="@{/feed(page=1, sortDirection=${sortDirection == 'asc' ? 'desc' : 'asc'}, author=${checkedAuthors}, tag=${checkedTags}, search=${!#strings.isEmpty(search)} ? ${search} : null)}"> Sort by Published Date</a> </span>
原理:Thymeleaf的@{...}表达式会自动对参数值进行URL编码(包括将空格转义为%20),同时如果参数值为null或空字符串,会自动忽略该参数,完全无需手动拼接字符串。
内容的提问来源于stack exchange,提问作者KOTIPALLI V KRISHNA LAKSHMI NA
相关产品推荐
相关产品推荐

