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) ; } }