我们在Sping Boot 上有两个应用程序,一个是基于Spring Rest API的,另一个是基于Spring MVC的。
由于一些业务原因,我们已将两个应用程序合并,因为上下文相同,除java.time.LocalDateTime格式(由Spring在rest API上自动执行)外,一切正常。之前,它将LocalDateTime格式设置为“2018-08- 30 T18:13:24”,但合并后显示为[ 2018,08,30,18,13,24 ],
我发现@EnableWebMVC注解是罪魁祸首,但在删除该注解后,web-mvc页面不工作。
我应该怎么做才能让日期以ISO(String)格式显示,并让视图解析器和jsp页面正常工作?
请帮忙谢谢。
3条答案
按热度按时间puruo6ea1#
每个人都说@EnableWebMvc是罪魁祸首。但是,没有人说WebMvc如何解决这个问题。
因此,为了回答这个问题,是的,有一种方法可以通过不删除@EnableWebMvc来解决此问题。
在回答之前,让我们先了解几个概念:
1.默认情况下,Sping Boot 将添加以下转换器:
1.字节数组Http消息转换器
1.字符串Http消息转换器
1.资源Http消息转换器
1.源Http消息转换器
1.表单Http消息转换器
1.MapJackson 2XmlHttp消息转换器
1.MapJackson2 Http消息转换器
1.因此,每当我们将java对象转换为JSON时,spring将按顺序逐个检查转换器列表,并选择相关的一个进行转换
1.现在,如果我们将自定义的MappingJackson 2 HttpMessageConverter作为最后一个元素添加到此列表中,那么spring将不会出现,因为在到达转换器(第9个元素)之前,第7个索引处存在默认转换器
1.因此,要解决此问题,我们需要删除默认的MappingJackson 2 HttpMessageConverte并添加我们的自定义转换器
**注意:**请不要从WebMvcConfigurer中使用configureMessageConverters()而不是extendMessageConverters(),因为configure方法将删除默认情况下安装得所有现有转换器.
希望它能帮助像我这样浪费了几个小时调试问题的人:)
chhqkbe12#
如果使用Jackson作为JSON <->POJOMap器,则可以设置以下属性:
spring.jackson.serialization.write-dates-as-timestamps
默认为true
,它将LocalDateTime
序列化为一个数组,如图所示。对于更细粒度的控件,还可以为日期时间字段添加注解,如下所示:
它优先于上述属性。
在这里查看其他与JSON相关的Sping Boot 属性:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#json-properties
2izufjch3#
对于那些仍然面临这个问题的人来说,
@EnableWebMVC
无疑是罪魁祸首,因为它禁用了Web MVC自动配置默认行为,而支持了您的行为。关于这一点,Sping Boot 参考文档指出:
Spring MVC自动配置
...
如果您想完全控制SpringMVC,可以添加您自己的@Configuration,用
@EnableWebMvc
注解...但是,您可以添加自定义配置,而不会丢失默认的自动配置行为。
如果您想要保留这些Sping Boot MVC自定义并进行更多MVC自定义(拦截器、格式化程序、视图控制器和其他特性),您可以添加您自己的WebMvcConfigurer类型的@Configuration类,但不带
@EnableWebMvc
。也就是说,删除@EnableWebMVC应该就可以了。