常见小知识点(DTO转entity 和ThreadLocal 和解决日期前端显示不正确)

1.将DTO对象转化为entity对象 使用sun公司提供的BeanUtils对象的静态方法copyProperties()
第一个参数是DTO对象 第二个参数 是要转化的entity对象

2.ThreadLocal并不是一个线程 而是Thread的局部变量
ThreadLocal为每一个线程单独一份存储空间 具有线程隔离的作用 只有在线程内才能取得对应的值,线程外则不能访问 Thread Local实现了一个线程内传递信息
而Http每一次请求都是一次单独的线程 从浏览器得来的请求 到拦截器成为一个线程 然后依次通过Controller层 Service层 Mapper层 最后原路返回
因此拦截器解析的jwt令牌里的id可以放在 ThreadLocal中供后面的Service层使用 而不用每次都解析JWT令牌
在每次使用完成都要释放资源
ThreadLocal中三个常用方法  set get  remove 
 

package com.sky.context;

public class BaseContext {

    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id) {
        threadLocal.set(id);
    }

    public static Long getCurrentId() {
        return threadLocal.get();
    }

    public static void removeCurrentId() {
        threadLocal.remove();
    }

}

3. LocalDateTime作为后端数据转化为json数据时会转成数组导致前端数据格式显示不正确 有两种解决方案
        1.在每一个LocalDateTime中添加注释声明转化为JSON时的格式

 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

        2.在WebMvcConfiguration中扩展Spring MVC的消息转化器 统一日期类型进行格式化处理
        日期转换工具类 

package com.sky.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

WebMvaConfig接口代码

package com.it.edu.common.utils;

import org.springframework.http.converter.HttpMessageConverter;

import java.util.List;

/**
 * web mvc配置接口
 */
public interface WebMvcConfig {
	/**
	 * 扩展消息转换器
	 * @param converters
	 */
	void extendMessageConverters(List<HttpMessageConverter<?>> converters) ;
}

 

WebMvcConfiguration中的代码

package com.it.edu.common.utils;

import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.util.List;

public class WebMvcConfiguration implements WebMvcConfig{

	/**
	 * 消息扩展转换器
	 */
	@Override
	public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
		//1.获得一个JSON转换器对象
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		//2.封装自己的转换器
		converter.setObjectMapper(new JacksonObjectMapper());
		//3.将JSON日期转化器添加到内置的集合中去 并且放在第一个元素的位置 优先级高
		converters.add(0, converter) ;

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值