问题
问题1:前端数据传输到后端时,后端没有接受到数据
解决:后端使用实体类来接受前端传来的josn格式的参数,需要使用@ResquestBody
问题2:后端传递的时间格式到前端,前端无法正常展示!
解决:
方式一:在属性上添加注解,对日期进行格式化@jsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
方式二:在WebMvcConfiguration中扩展Spring MVC的消息转换器,统一对日期类型进行格式化。
下面详细讲解一下方式二:
工作过程:其实是一个扩展消息转换器的流程,分为3步,
1.创建消息转换器对象
2.为消息转换器设置一个对象转换器:可以将java对象序列化json数据
3.将消息转换器添加到容器中,且设置为优先
对应代码如下:
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){
log.info("扩展消息转换器...");
// 创建消息转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 设置对象转换器
converter.setObjectMapper(new JacksonObjectMapper());
// 将自己的消息转化器加入容器中
converter.add(0,converter);
}
相信你可能对于对象转换器也一定的疑惑,同样的,我也是,让我们看看其JacksonObjectMapper()的内部实现过程吧!
其内部是继承ObjectMapper对象,其主要功能是各个类型的互相转换,关于ObjectMapper的更多资料可以观看[ https://blog.csdn.net/qq_42017395/article/details/107555339 ]
实现如下:
/**
* 对象映射器:基于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);
}
}
对上面进行整理可以得到基本步骤如下:
1.基本异常配置设置。
2.创建SimpleModule对象,并进行设置序列化,以及反序列化。
3.在相应模块添加SimpleModule对象。
技术
ThreadLocal
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取对应的值,线程外则不能访问。
目的:为了解决一些需要知道一些操作其操作者的id。
实际代码:
public stactic ThreadLocal<long> threadLocal = new ThreadLocal<>();//创建一个ThreadLocal对象,线程内具备独立的存储空间
通过在拦截器的token中提取相应的id数据存储到对应独立的ThreadLocal空间中,随后当需要时,就可以随时在此存储空间提取相应的id数据。
Mybatis-PageHelper
通过传入参数页码,每页个数,最后通过计算存储Page参数到ThredLocal空间中,在MApper映射到相应的查询语句中!
PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());//传入前端传来的页码,页码大小参数
浙公网安备 33010602011771号