Spring MVC @EnableWebMvc以数组格式显示日期

hc8w905p  于 2022-11-14  发布在  Spring
关注(0)|答案(3)|浏览(120)

我们在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页面正常工作?
请帮忙谢谢。

puruo6ea

puruo6ea1#

每个人都说@EnableWebMvc是罪魁祸首。但是,没有人说WebMvc如何解决这个问题。
因此,为了回答这个问题,是的,有一种方法可以通过不删除@EnableWebMvc来解决此问题。
在回答之前,让我们先了解几个概念:

  • HttpMessageConverters -〉这些是将Java对象与JSON/XML相互转换的工具

1.默认情况下,Sping Boot 将添加以下转换器:
1.字节数组Http消息转换器
1.字符串Http消息转换器
1.资源Http消息转换器
1.源Http消息转换器
1.表单Http消息转换器

  1. Jaxb 2根元素Http消息转换器
    1.MapJackson 2XmlHttp消息转换器
    1.MapJackson2 Http消息转换器
    1.因此,每当我们将java对象转换为JSON时,spring将按顺序逐个检查转换器列表,并选择相关的一个进行转换
    1.现在,如果我们将自定义的MappingJackson 2 HttpMessageConverter作为最后一个元素添加到此列表中,那么spring将不会出现,因为在到达转换器(第9个元素)之前,第7个索引处存在默认转换器
    1.因此,要解决此问题,我们需要删除默认的MappingJackson 2 HttpMessageConverte并添加我们的自定义转换器
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//        Remove the default MappingJackson2HttpMessageConverter
        converters.removeIf(converter -> {
            String converterName = converter.getClass().getSimpleName();
            return converterName.equals("MappingJackson2HttpMessageConverter");
        });
//        Add your custom MappingJackson2HttpMessageConverter
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        converter.setObjectMapper(objectMapper);
        converters.add(converter);
        WebMvcConfigurer.super.extendMessageConverters(converters);
    }
}

**注意:**请不要从WebMvcConfigurer中使用configureMessageConverters()而不是extendMessageConverters(),因为configure方法将删除默认情况下安装得所有现有转换器.

希望它能帮助像我这样浪费了几个小时调试问题的人:)

chhqkbe1

chhqkbe12#

如果使用Jackson作为JSON <->POJOMap器,则可以设置以下属性:

spring:
  jackson:
    date-format: yyyy-MM-dd'T'hh:mm:ss
    serialization:
      write-dates-as-timestamps: false

spring.jackson.serialization.write-dates-as-timestamps默认为true,它将LocalDateTime序列化为一个数组,如图所示。
对于更细粒度的控件,还可以为日期时间字段添加注解,如下所示:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'hh:mm:ss")
private LocalDateTime datetime;

它优先于上述属性。
在这里查看其他与JSON相关的Sping Boot 属性:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#json-properties

2izufjch

2izufjch3#

对于那些仍然面临这个问题的人来说,@EnableWebMVC无疑是罪魁祸首,因为它禁用了Web MVC自动配置默认行为,而支持了您的行为。
关于这一点,Sping Boot 参考文档指出:

Spring MVC自动配置

...
如果您想完全控制SpringMVC,可以添加您自己的@Configuration,用@EnableWebMvc注解...
但是,您可以添加自定义配置,而不会丢失默认的自动配置行为。
如果您想要保留这些Sping Boot MVC自定义并进行更多MVC自定义(拦截器、格式化程序、视图控制器和其他特性),您可以添加您自己的WebMvcConfigurer类型的@Configuration类,但不带@EnableWebMvc
也就是说,删除@EnableWebMVC应该就可以了

相关问题