Spring MVC Controller返回json日期格式配置失效的解决办法

如题,Spring MVC 4.3.0版本,配置jackson读写json。Controller层方法返回值对象包含java.util.Date类型的属性,并且在applicationContext.xml中配置了jackson的日期格式:

XML 复制代码
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!--                <property name="objectMapper" ref="objectMapper"/>-->
                <constructor-arg index="0" ref="objectMapper"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
        <property name="simpleDateFormat" value="yyyy-MM-dd HH:mm:ss"/>
    </bean>

但是调用Controller层方法发现日期格式返回的是时间戳,日期格式配置失效了。

经过多次调试跟踪,笔者发现原因是<mvc:annotation-driven>标签会自动注册RequestMappingHandlerAdapter(位置在WebMvcConfigurationSupport类中),其中setMessageConverters方法会覆盖掉我们配置的jackson converter,因此问题的解决从Spring容器中获取RequestMappingHandlerAdapter这个bean,然后找到内部的MappingJackson2HttpMessageConverter,以代码的方式重新配置即可。

java 复制代码
@Configuration
//@EnableWebMvc
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    private final Logger logger = LoggerFactory.getLogger(MyWebMvcConfigurer.class);

    @Autowired
    private RequestMappingHandlerAdapter adapter;

    @PostConstruct
    public void configureAdapter() {
        for(HttpMessageConverter<?> converter: adapter.getMessageConverters()) {
            if(converter instanceof MappingJackson2HttpMessageConverter) {
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
                ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper);
            }
        }
    }
}
相关推荐
好学且牛逼的马2 小时前
从“Servlet汪洋”到“响应式时代”:Spring MVC 1.x到5.x演进全记录与核心知识点详解
spring·servlet·mvc
玹外之音3 小时前
Spring AI 多模态实战:手把手教你构建图像理解应用
spring·aigc
数据知道3 小时前
PostgreSQL:如何直接在数据库中查询 CSV/JSON文件?
数据库·postgresql·json
我叫张土豆4 小时前
Swagger MCP 实战:把 OpenAPI 变成可控的 MCP 工具(Spring Boot + Spring AI)
人工智能·spring boot·spring
人道领域4 小时前
Maven多环境配置实战指南
java·数据库·spring
利刃大大4 小时前
【SpringCloud】网关GateWay && Spring Cloud Gateway && Route Predicate Factories
网关·spring·spring cloud·gateway
弹简特4 小时前
【JavaEE09-后端部分】SpringMVC04-SpringMVC第三大核心-处理响应和@RequestMapping详解
java·spring boot·spring·java-ee·tomcat
那我掉的头发算什么5 小时前
【图书管理系统】基于Spring全家桶的图书管理系统(下)
java·数据库·spring boot·后端·spring·mybatis
亓才孓14 小时前
[SpringIOC]NoSuchBeanDefinitionException
java·spring
百锦再16 小时前
Java多线程编程全面解析:从原理到实战
java·开发语言·python·spring·kafka·tomcat·maven