springboot&微信小程序实战_项目开发问题
这里是我对开发过程中遇到问题的总结,如果你遇到新的问题或新的解决方法也可通知我,我进行更改,一起学习,互相进步
项目源代码到这链接
1. 通用mapper 与 springboot热部署冲突。
描述:出现xx类缺少xx方法
原因:类加载器不一样
解决方法:统一类加载器,或者换高版本的通用mapper
2. spring boot2 配置 FastJsonHttpMessageConverter 不起作用
描述:数据库数据为null时,前端显示也为null,不能显示空字符串
原因:SpringBoot 2.0.1版本中加载WebMvcConfigurer的顺序发生了变动,会优先执行MappingJackson2HttpMessageConverter,优先使用Jackson处理
解决方法: 指定FastJsonHttpMessageConverter在converters内的顺序converters.add(0,fastJsonHttpMessageConverter)
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1.需要定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteDateUseDateFormat);
// System.out.println("111111111111111111111111111111111111111111111111111111111");
//3处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
//5.将convert添加到converters当中.
//指定 fastJson 执行顺序,不然可能会用 jsonfast SpringBoot 2.0.1版本中加载WebMvcConfigurer的顺序发生了变动
// 故需使用converters.add(0, converter);指定FastJsonHttpMessageConverter在converters内的顺序,否则在SpringBoot 2.0.1及之后的版本中将优先使用Jackson处理
converters.add(0,fastJsonHttpMessageConverter);
}
3. 通用 mapper 逆向工程
- 在mvn 下运行
mybatis-generator:generate -e
<!--逆向工程插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>src/main/resources/mybaits-generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<!--<version>8.0.15</version>-->
</dependency>
</dependencies>
</plugin>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!--分隔符 -->
<!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<property name="autoDelimitKeywords" value="true"/>
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!-- 需要用到 myMapper 工具类 -->
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="cn.zxhysy.booksmall.util.mapper.MyMapper"/>
</plugin>
<!-- 高版本用:driverClass="com.mysql.cj.jdbc.Driver"-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/booksmall?serverTimezone=UTC"
userId="root"
password="root">
</jdbcConnection>
<!-- 对应生成的pojo所在包 -->
<javaModelGenerator targetPackage="cn.zxhysy.booksmall.entity" targetProject="src/main/java"/>
<!-- 对应生成的mapper所在目录 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<!-- 配置mapper对应的java映射 -->
<javaClientGenerator targetPackage="cn.zxhysy.booksmall.mapper" targetProject="src/main/java"
type="XMLMAPPER"/>
<!-- 指定数据库表 多个表示,可用多个table标签-->
<table tableName="tb_admin" domainObjectName="Admin"></table>
<table tableName="tb_user" domainObjectName="User"></table>
<table tableName="tb_category" domainObjectName="BookCategory"></table>
<table tableName="tb_book" domainObjectName="bookInfo"></table>
<table tableName="tb_order_master" domainObjectName="OrderMaster"></table>
<table tableName="tb_order_detail" domainObjectName="OrderDetail"></table>
</context>
</generatorConfiguration>
4. 关于MGB逆向生成没有主键列的问题
- mysql 驱动太高了, 换成 5.1.x版本
- 添加属性,放首位
<property name="javaFileEncoding" value="UTF-8"/>
- 采用
driverClass="com.mysql.jdbc.Driver"
不要用driverClass="com.mysql.cj.jdbc.Driver"
5. 有状态 session
5.1 Redis-session
- 用户存储到 redis 缓存中,形成无状态回话
- 便于扩展,当单体应用该扩展成集群会相对方便
- 便于权限验证
6. 微信小程序 图片路劲拼接时 404
解决思路:
- 可以在js时就需要手动拼接变量
- 也可以在渲染层上加个 wx:if 判断是否存在该变量
<!-- 这里必须要判断下 book.icon 是否存在 因为再一开始渲染时,会先渲染 imgUrl(实际存在的data对象里面的属性) -->
<block wx:if="{{book.icon}}">
<image src='{{imgUrl}}{{book.icon}}' class="goods-thumbnail" lazy-load="true"/>
</block>
7. 跳转页面时,带上对象数据,对象数据中可能带有特殊字符,则会报错
解决思路:
- 在传递前先用
JSON.stringify(item)
将对象序列化为字符串,再对字符串的特殊字符进行转义,用encodeURIComponent(str)
let item2 = JSON.stringify(item)
//这里需要将特殊符号进行转义,不然在转换 JSON格式的时候会报错
// encodeURIComponent 转移字符串 主要是 书本描述
item = encodeURIComponent(item2)
- 在跳转的页面接收数据,先用
decodeURIComponent(str)
进行反转义,再用JSON.parse(str)
转为对象
// 商品传递过来的数据
// 对对象的特殊数据进行反转义
let item = decodeURIComponent(options.item2)
const book = JSON.parse(item)
- 最简单方式,重新请求一次
8. 通用mapper insertList 的巨坑
记录一个通用mapper的一个小坑,MySQLMapper的insertList方法中传入list时,这个Entity的主键必须为自增主键,否则他在执行sql是不会去插入主键,自然就会报一些奇怪的错误了,比如DB2的-407, 主键列没有默认值
9.浅谈微信小程序 this.setData
如果你学过 vue 那个你会知道,我们修改数组对象数据时,如果不用 vue 提供的操作数组的方法,在数组发生变化的时候,页面并没有重新渲染。同理 微信小程序也一样,当我们操作数组时,数组对象结构没法说改变的情况下,是不会重新渲染页面的,这是,我们就需要用 this.setData({OBJECT}) 告诉页面,我们这个OBJECT数据发生了变化,需要重新渲染
10.部署项目到服务器,在获取时间中有异常,数据库中存储的值没有错误,设置时也没错。获取时多了八个小时。
解决方法:在连接数据库的配置信息中,url 后面的 serverTimezone=UTC
——> 改为 serverTimezone=Asia/Shanghai
是由于时区问题。默认mysql是从时区0开始计算的