SpringMVC @RequestBody Date类型的Json转换方式

Spring MVC允许我们使用@RequestBody将请求体中的JSON转化为Java对象。由于Java中没有内置的方法来解析JSON数据,因此Spring MVC中使用Jackson组件来解析JSON数据。

Spring MVC允许我们使用@RequestBody将请求体中的JSON转化为Java对象。由于Java中没有内置的方法来解析JSON数据,因此Spring MVC中使用Jackson组件来解析JSON数据。

当JSON串中给定一个日期类型未指定日期时间格式时,默认的解析方式是ISO-8601规范的日期时间格式(例如:yyyy-MM-ddTHH:mm:ss.SSSZ)。

要使用SpringMVC @RequestBody进行JSON转换,需要按照以下步骤操作:

步骤1:添加Maven依赖

在pom.xml文件中,添加以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

<!-- For Java 8 date/time classes support; also requires Java 8 -->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>${jackson.version}</version>
</dependency>

上述依赖项允许Spring MVC使用Jackson组件将JSON转换为Java对象。

步骤2:定义Java对象

定义一个Java对象,其中包含日期属性。在这里,我们假设已经有一个实体类User,它包含属性namebirthdaybirthday属性的类型是java.util.Date

public class User {
    private String name;
    private Date birthday;
    // ...
    // 省略getter和setter方法
}

步骤3:配置Spring MVC日期格式

使用以下代码配置Spring MVC,将日期格式设置为"yyyy-MM-dd":

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder
                                        .json()
                                        .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                                        .dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
                                        .build();

        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    }
}

步骤4:编写Controller

在Controller中,使用@RequestBody注解将请求体中的JSON转换为Java对象:

@RestController
public class UserController {
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // ...
        // 省略其他代码
        return user;
    }
}

这样,当提交JSON数据时,SpringMVC可以自动将日期字符串转换为java.util.Date类型。

示例1

为了更好理解,请看下面的示例:

首先,在Postman中设置请求头为"Content-Type: application/json"。创建一个POST请求,URL为"/users",请求体为一个JSON对象,示例如下:

{
    "name": "Tom",
    "birthday": "1995-06-02"
}

在Controller中,将请求体转换为Java对象,并打印日志。

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    log.info("create user: {}", user);
    return user;
}

最后,在控制台上可以看到如下输出:

create user: User(name=Tom, birthday=Sun Jun 02 00:00:00 CST 1995)

可以看到,"birthday"属性被成功从字符串转换为了Java的Date类型。

示例2

下面的例子演示一个定制化的日期/时间格式:

假设需要将日期格式设置为"yyyy-MM-dd'T'HH:mm:ss.SSSZ",在WebMvcConfig中配置相应的日期格式:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder
                                        .json()
                                        .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                                        .dateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"))
                                        .build();

        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    }
}

接下来,使用示例1中的代码创建一个日期为"1995-06-02 12:34:56.789"的User对象:

{
    "name": "Tom",
    "birthday": "1995-06-02T12:34:56.789+0800"
}

假设客户端提交的日期格式为"yyyy-MM-dd'T'HH:mm:ss.SSSZ",在控制台上可以看到如下输出:

create user: User(name=Tom, birthday=Fri Jun 02 12:34:56 CST 1995)

可以看到,日期字符串被成功解析为Date对象,并且Java对象中的日期值已经正确反序列化。

本文标题为:SpringMVC @RequestBody Date类型的Json转换方式

基础教程推荐