Ryan445

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题

问题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());//传入前端传来的页码,页码大小参数
posted on 2025-07-13 16:59  Ryan455  阅读(332)  评论(0)    收藏  举报