Spring Cloud微服务实战 打造企业级优惠券系统 3-10 SpringBoot Jackson的使用技巧

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":"小魏"}
诸葛
原文地址:https://www.cnblogs.com/1446358788-qq/p/14296102.html