我是Spring的新手,并尝试使用Spring Formatting SPI进行UI层解析和值的打印。
我已经定义了一个自定义格式化程序,并且解析端正常工作,如果我进行直接conversionService.convert(someObject, String.class)
调用,则使用我定义的格式化程序正确转换值(即print()ed)。
但是,在我的模板中,我只显示对象的toString()表示,而不是已注册的conversionService.convert()
调用中的字符串。
我使用Mustache作为模板引擎而不是Velocity或Freemarker(感谢上帝)。格式化SPI是否与JSP标记相关联和/或我是否需要扩展我正在使用的Mustache库以支持Spring绑定/表单标记以使其正常工作?
我已经搜索了文档并搜索了所有相关信息,但是如果我的RTFM / Google技能缺乏,我很抱歉。
答案 0 :(得分:1)
首先,如果您查看该Mustache Spring View库的pom.xml文件,它不使用Mustache.java,它实际上是使用Jmustache:
https://github.com/sps/mustache-spring-view/blob/master/pom.xml
<dependency>
<groupId>com.samskivert</groupId>
<artifactId>jmustache</artifactId>
<version>${jmustache.version}</version>
</dependency>
你可以在这里找到Jmustache:
https://github.com/samskivert/jmustache
视图只是将您的模型传递为Map&lt; String,Object&gt;到Jmustache模板“execute()”方法,所以在那之后Spring不再涉及了。那时,所有关于Jmustache都会使用您的模板语法和模型值来确定如何生成输出。 Jmustache代码有点复杂且难以理解,但我认为如果查看Mustache类中定义的“Template.Segment”子类,您将看到Object值使用String.valueOf(Object)转向字符串的位置在第568行:
String.valueOf(Object)只调用传入的Object上的toString()(如果它不为null):
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#valueOf%28java.lang.Object%29
我认为你有两种选择。在填充模型之前,先在控制器中处理所有String转换,然后确保仅使用String值填充模型。或者,您可以尝试扩展或修改Jmustache代码,以使其使用Spring的转换API来处理对字符串的转换,而不是使用String.valueOf()。