首页 > 解决方案 > Spring XML,真的不是一种在字符串值中使用尖括号或反斜杠代码的方法吗?

问题描述

我很难在 Spring 中定义一个包含 HTML 模板的字符串,即类似于以下内容,而 Spring 不接受它:

<bean class = "com.example.View">
  <property name = "header">
    <![CDATA[<p>
\t<h1>An example of header</h1>
\t<hr/>
    </p>]]>
</property>

这在 XML 中通常是可能的,CDATA 允许告诉解析器要忽略什么。但是,我在 Spring XML 中找不到任何东西来将常量值定义为文本节点,而不是“值”属性的内容(他们的 XSD 有一个“”标签,但不是为了这个目的)。此外,我希望字符串以 Java 方式解释,即 '\t' 被翻译成制表符。

我已经阅读了其他建议 XML 引用字符(例如 <> )的答案(即,使用 '<>'),但这在上述情况下根本不切实际,我不敢相信没有更简单的解决方案。请注意,我已经知道我可以简单地将该 HTML 发送到一个单独的文件并使用一些静态方法将后者读入一个字符串,但我正在考虑我有许多这些片段并且我希望它们与 Spring豆配置。

标签: javaspring

解决方案


好的,正如@M.Deinum 在评论中所建议的(再次感谢),解决方案就是使用<value>+ CDATA

<property name = "header">
  <value><![CDATA[  Just a <b>test</b> value.}]]></value>
</property>

我最初尝试过,但由于某种原因我无法重现,Spring(即他们的模式的 XML 验证)抱怨<value>在那个地方无效。

这允许直接编写诸如 \t 之类的内容,即,只需在编辑文件时按 Tab 即可。但是可以结合 SpEL 和 Apache commons 来管理想要明确说 '\t' 的情况:

<property name = "header">
  <value><![CDATA[#{T(org.apache.commons.lang3.StringEscapeUtils).unescapeJava (
                "\tJust a <b>test</b> value."
  )}]]></value>
</property>

有点难看,但有效。


推荐阅读