Spring Boot2自动化配置及使用jackson进行json解析

快速体验 jackson

jackson是spring boot 默认的json解析方案,当我们创建maven工程引入 spring-boot-starter-web时 jackson的相关依赖就以及自动引入了,如下,

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下面就是引入了包含jackson在内的相关依赖
在这里插入图片描述
接下来,我们来快速体验一下,创建UserController类和User实体类

@RestController
public class UserController {
    @GetMapping("/user")
    public User getUser() {
        User user = new User();
        user.setId(1);
        user.setUserName("name");
        user.setCreateDate(new Date());
        return user;
    }
}
public class User {
    private int id;
    private String userName;
    private Date createDate;
    getter/setter...
}

启动工程,浏览器或者其他工具访问localhost:8080/user,可以看到User对象已经解析成(序列化)json格式的数据,如下:
在这里插入图片描述
这里我用一个JSONView的插件,所以数据看起来比较格式化。

springboot 对 jackson自动化配置

我们什么也没做怎么就把java对象转成了json?这是因为spring boot帮我我们做了自动化配置,关于jackson的自动化配置类在包org.springframework.boot.autoconfigure.http下,从在这个包下还有其他的配置类,比如Gson。
在这里插入图片描述
JacksonHttpMessageConvertersConfiguration就是jackson的自动化配置类,这个类中如果我们没有提供MappingJackson2HttpMessageConverter的话,它会自动给我们提供,前提是我们没有提供,这就实现了自动化配置。下面是源码片段,

static class MappingJackson2HttpMessageConverterConfiguration {

	@Bean
	@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,
			ignoredType = {
					"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter",
					"org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })
	MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
		return new MappingJackson2HttpMessageConverter(objectMapper);
	}
}

由此,我们是不是可以自己提供MappingJackson2HttpMessageConverter,然后做一些自定义的配置,当然是可以的,下面我们就自定义jackson的时间格式为yyyy/MM/dd

自定义配置类修改jackson的时间格式

我们只需要定义一个配置类,提供一个MappingJackson2HttpMessageConverter 对象就可以了。ObjectMapper 是jackson提供一个重要的类,可以相互转换java对象和json字符串。源码中ObjectMapper 是作为参数传进来,现在我们需要创建出ObjectMapper 对象并设置MappingJackson2HttpMessageConverter的objectMapper属性。

@Configuration
public class WebMvcConfig {
    @Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);  // 设置objectMapper
        return mappingJackson2HttpMessageConverter;
    }
}

配置完成,运行启动类,看下效果,是起了作用的。
在这里插入图片描述
当然还有另外一种方式定义时间格式,那就是在需要转换的类中的属性上使用 @JsonFormat 注解,即使我们配置了MappingJackson2HttpMessageConverter,时间格式还是会使用注解里面的。

  	@JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;

在这里插入图片描述

进一步简化配置类修改时间格式

在上面的配置类我们不仅提供了一个MappingJackson2HttpMessageConverter 对象,还创建了一个ObjectMapper对象,源码中在创建MappingJackson2HttpMessageConverter对象时ObjectMapper是作为参数传进来的,ObjectMapper对象是在org.springframework.boot.autoconfigure.jacksonJacksonAutoConfiguration配置类中创建的,下面是源码片段,意思是如果没有提供ObjectMapper就创建。

	@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)
	static class JacksonObjectMapperConfiguration {

		@Bean
		@Primary
		@ConditionalOnMissingBean
		ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
			return builder.createXmlMapper(false).build();
		}

	}

那么我们只需要提供一个ObjectMapper对象就可以实现修改时间格式的需求。

@Configuration
public class WebMvcConfig {
//    @Bean
//    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
//        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
//        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);  // 设置objectMapper
//        return mappingJackson2HttpMessageConverter;
//    }
    @Bean
    ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));
        return objectMapper;
    }
}
发布了28 篇原创文章 · 获赞 1 · 访问量 1864

猜你喜欢

转载自blog.csdn.net/m0_46130323/article/details/103885533