0 课程地址
http://coding.imooc.com/lesson/380.html#mid=28361
1 浓缩精华
1.1 jackson通用类配置,见4.1
1.2 jackson其他配置
https://www.cnblogs.com/1446358788-qq/p/13976247.html
1.3 JackSon中的多个ObjectMapper的设置
这其实不是 Jackson 的问题,而是对 Spring IOC 的理解,ObjectMapper 肯定是可以定义多个的,但是,你在注入的时候需要指定好注入的是哪一个,否则,就会出现你说的这个报错了。
可以看看 @Autowired、@Resource、@Primary 这些注解的特性和含义。
1.4 @Configuation总结
@Configuation等价于<Beans></Beans>
@Bean等价于<Bean></Bean>
参见:https://blog.csdn.net/u014199143/article/details/80692685
1.5 jdk与lombok版本对应
https://projectlombok.org/changelog
https://www.cnblogs.com/1446358788-qq/articles/14615938.html
2 个人关注
2.1 jdk8的lambda表达式和lombok的builder方法的却别和关联是什么?
这个暂时没找到答案,看jdk8视频的时候搞一下
3 课程内容
4 代码演练
4.1 jackson通用类配置(如果同一种模式,配置一次,所有使用jackson案例都可以使用)
bean类
package com.imooc.springboot.application.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Date; import java.util.logging.SimpleFormatter; /** * IMoocer * * @author 魏豆豆 * @date 2021/4/4 */ @Data//getset和toString方法 @Builder//buil方法,参见Controller层的调用 @NoArgsConstructor//无参构造方法 @AllArgsConstructor//全参构造器 @JsonIgnoreProperties({"address"}) public class IMoocer { @JsonProperty("name")//别名,传值后key值变为name private String userName; private String age; //@JsonIgnore private String address; //记下 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date birthday; }
配置类:
package com.imooc.springboot.application.config; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.text.SimpleDateFormat; /** * JacksonConfig * * @author 魏豆豆 * @date 2021/4/4 */ @Configuration public class JacksonConfig { @Bean public ObjectMapper buildJackson(){ ObjectMapper objectMapper = new ObjectMapper(); //记一下 初始化objectMapper,公共配置类,初始化日期的格式(JacksonConfig 是作用于全局的)。 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //属性为null,不参与序列化 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return objectMapper; } }
调用Controller类
package com.imooc.springboot.application.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.imooc.springboot.application.config.SpringBootConfig; import com.imooc.springboot.application.vo.IMoocer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.io.IOException; import java.util.Date; /** * UserController * * @author 魏豆豆 * @date 2021/3/13 */ @RequestMapping("/userController") //注解可以将HTTP请求映射给controller来处理,包括返回视图页面的controller和Rest服务的controller。 @ResponseBody //@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。 @Controller//@Controller标识的类,该类代表控制器类(控制层/表现层)。这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层),@Service标识的类中的方法可以继续调用@Resposity标识的接口实现类(Dao层/持久层)。 @Slf4j public class UserController { @Value("${com.imooc.userid}") private String userid; @Value("${com.imooc.username}") private String username; @Autowired//自动注入Compenent组件 private SpringBootConfig springBootConfig; /** * 使用构造方法 */ @Autowired private ObjectMapper objectMapper; /** * 访问地址:127.0.0.1:8081/imooc/userController/testInjectOne */ @GetMapping("/testInjectOne") public void testConfigInjectOne(){ /* System.out.println("userid="+this.userid); System.out.println("username="+this.username);*/ log.info("userid="+this.userid); log.info("username="+this.username); } /** * 访问地址:127.0.0.1:8081/imooc/userController/testInjectTwo */ @GetMapping("/testInjectTwo") public void testConfigInjectTwo(){ log.info("userid="+springBootConfig.getUserid()); log.info("username="+springBootConfig.getUsername()); } /** * 访问地址:127.0.0.1:8081/imooc/userController/testJackson * 测试jackson序列化和反序列化 */ @GetMapping("/testJackson") public IMoocer testJackson() throws IOException { //记一下build方法 IMoocer iMoocer = IMoocer.builder() .userName("小魏") .age("18") .address("北京") .birthday(new Date()) .build(); //记一下 序列化 方法 String sJsonString = objectMapper.writeValueAsString(iMoocer); log.info("序列化方法:=============="+sJsonString); //反序列化 IMoocer iMoocer1 = objectMapper.readValue(sJsonString,IMoocer.class); return iMoocer1; } }
postman访问
打印日志:
2021-04-04 11:46:56.602 INFO 6068 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/imooc] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2021-04-04 11:46:56.602 INFO 6068 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2021-04-04 11:46:56.647 INFO 6068 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 44 ms 2021-04-04 11:46:56.968 INFO 6068 --- [nio-8081-exec-1] c.i.s.a.controller.UserController : 序列化方法:=============={"age":"18","birthday":"2021-04-04 03:46:56","name":"小魏"}
诸葛