🍎细心亿点点-记录日常编码不容易注意到的小错误
SpringBoot
关于application.yml中Mybatis映射器位置说明
mybatis: mapperLocations: classpath:mapper/**/*.xml type-aliases-package: com.zhixi.pojo # 所有Entity别名类所在包
*.xml区别:
- mapper/**/*.xml:匹配mapper目录下任意层级的目录的任意xml文件
- mapper/*.xml:匹配mapper目录下下所有的xml
classpath区别:
- classpath:表示只在当前类加载器的classpath路径下查找资源
- classpath*:表示在所有的类加载器的classpath路径下查找资源
举个例子,假设我们有一个项目,其中有两个maven模块 A 和 B,A依赖于B。 我们在A模块中使用 classpath: 和 classpath*: 加载B模块中的资源文件。 如果使用 classpath: 前缀,只会在A模块自己的classpath路径下查找资源,而不会在B模块中查找。 如果使用 classpath*: 前缀,则会在A模块和B模块的classpath路径下查找资源。 因此,当我们需要加载其他模块中的资源文件时,应该使用 classpath*: 而如果只需要加载当前模块中的资源文件时,可以使用 classpath:
Maven打jar包中没有lib,错误提示:没有主清单属性
https://www.cnblogs.com/zhangzhixi/p/17253752.html
LocalDateTime格式化
在数据库字段中通常有Date字段,映射到实体类的属性上面对应的应该就是LocalDateTime类型的数据。
这样我们在通过JSON传递数据的时候,需要单独对此类型进行处理:
/** * 创建时间 */ @TableField(value = "create_time")// 数据库中字段名称 @JsonDeserialize(using = LocalDateTimeDeserializer.class)// 反序列化 @JsonSerialize(using = LocalDateTimeSerializer.class)// 序列化 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")// 对入参进行格式化 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")// 对出参进行格式化 private LocalDateTime createTime;
SpringBoot中配置Servlet乱码
今天在做测试的时候,使用到了@WebServlet,不出所料出现了乱码
两种解决办法:
第一种:写过滤器
@WebFilter("/*") public class EncodingFilter extends HttpFilter { @Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { /*设置编码*/ request.setCharacterEncoding( "UTF-8" ); response.setContentType( "text/html;charset=UTF-8" ); chain.doFilter(request, response); } }
第二种(推荐):直接在application.properties中设置
#客户端请求的 URL 编码方式 server.tomcat.uri-encoding=UTF-8 #指定使用的编码方式 server.servlet.encoding.charset=UTF-8 #是否强制使用指定的编码方式。如果设置为 true,即强制使用指定的编码方式,无论请求头中是否指定了编码方式。如果设置为 false,会根据请求头中的编码方式自动选择编码方式 server.servlet.encoding.force=true
Spring
编写配置文件需要注意的点:
MySQL5.0+跟MySQL8.0+:
在以前使用mysql5.0+的jar包,连接池使用的驱动通常是:com.mysql.jdbc.Driver
在现在使用mysql8.0+的jar包中,建议使用连接池驱动:com.mysql.cj.jdbc.Driver”。通过SPI自动注册驱动程序,通常不需要手动加载驱动程序类。
XML中:
MySQL5.0+中的数据库连接信息:"jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"
MySQL8.0+中要设置时区信息:"jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"
- 在xml文件中,分号;要用&表示!
- useSSL=true时 数据库连接 安全认证不通过 解决办法:将useSSL true改为false (可以使用)
properties数据库连接信息:
db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC jdbc.username=root jdbc. password =xxx
通常我们都会写一个db.properties文件保存数据库连接信息,然后在xml文件中通过:<context:property-placeholder location="classpath:db.properties"/>引入配置文件
需要注意的是在properties中要使用&进行配置的分割,这个坑很重要!!!不然真的是找bug找一天~
- 使用&
SSM项目中解决乱码方案(尽量都配)
1、Tomcat
需要注意一点:tomcat 8后的版本是默认配置的,这是针对8以前的版本配置
- 找到Tomcat安装目录的conf找到Service.xml文件
- 修改<Connector>标签中的内容
2、请求乱码的过滤
在web.xml中配置过滤器:
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3、响应乱码
在spring的配置文件applicationContext.xml中设置
<!--启用Spring MVC的注解开发模式 并设置编码格式--> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=utf-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
4、编写Controller代码设置
/*设置编码*/ request.setCharacterEncoding( "UTF-8" ); response.setContentType( "text/html;charset=UTF-8" );
5、更改IDEA的编码
这里注意一下,不要勾选native-to-ascli,否则会导致,上传代码到git上面,配置文件的注释乱码问题。
Mybatis
1、xml配置文件符号转义
编写SQL中会用到<,>,<=,>= 等,但是在mybatis中不可以这么写,与xml文件的元素<>冲突,所以需要转义
符号 | 原始字符 | 转义字符 |
---|---|---|
大于 | > | > |
大于等于 | >= | >= |
小于 | < | < |
小于等于 | <= | <= |
不等于 | <> | <> |
和 | & | & |
单引号 | ’ | ' |
双引号 | " | " |
或者使用CDATA 区段,所有 XML 文档中的文本均会被解析器解析。只有 CDATA 区段(CDATA section)中的文本会被解析器忽略:
大于等于 <![CDATA[ >= ]]> 小于等于 <![CDATA[ <= ]]> 不等于<![CDATA[ <> ]]>
2、JdbcType
在执行SQL时MyBatis会自动通过对象中的属性给SQL中参数赋值,它会自动将Java类型转换成数据库的类型。而一旦传入的是null 程序就无法准确判断这个类型应该是什么(是Integer?是VARCHAR?还是别的?),就有可能将类型转换错误,从而报错。
加入jdbcType正是为了解决这样的报错,需要针对这些可能为空的字段,手动指定其转换时用到的类型。
Mybatis | JdbcType | Oracle | MySql |
---|---|---|---|
JdbcType | ARRAY | ||
JdbcType | BIGINT | BIGINT | |
JdbcType | BINARY | ||
JdbcType | BIT | BIT | |
JdbcType | BLOB | BLOB | BLOB |
JdbcType | BOOLEAN | ||
JdbcType | CHAR | CHAR | CHAR |
JdbcType | CLOB | CLOB | TEXT |
JdbcType | CURSOR | ||
JdbcType | DATE | DATE | DATE |
JdbcType | DECIMAL | DECIMAL | DECIMAL |
JdbcType | DOUBLE | NUMBER | DOUBLE |
JdbcType | FLOAT | FLOAT | FLOAT |
JdbcType | INTEGER | INTEGER | INTEGER |
JdbcType | LONGVARBINARY | ||
JdbcType | LONGVARCHAR | LONG VARCHAR | |
JdbcType | NCHAR | NCHAR | |
JdbcType | NCLOB | NCLOB | |
JdbcType | NULL | ||
JdbcType | NUMERIC | NUMERIC/NUMBER | NUMERIC |
JdbcType | NVARCHAR | ||
JdbcType | OTHER | ||
JdbcType | REAL | REAL | REAL |
JdbcType | SMALLINT | SMALLINT | SMALLINT |
JdbcType | STRUCT | ||
JdbcType | TIME | TIME | |
JdbcType | TIMESTAMP | TIMESTAMP | TIMESTAMP/DATETIME |
JdbcType | TINYINT | TINYINT | |
JdbcType | UNDEFINED | ||
JdbcType | VARBINARY | ||
JdbcType | VARCHAR | VARCHAR | VARCHAR |
3、$跟#的使用区别:
参考:https://blog.csdn.net/qq_58772217/article/details/122099893
在Mybatis中#和$的主要区别是:
#传入的参数在SQL中显示为字符串,$传入的参数在SqL中直接显示为传入的值
说下我在模糊查询的时候出现的一个关于$跟#相关的错误:Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1
原因就是我在写代码的时候将应该写成$的地方写成了#
List<Student> allByNameStudents = studentService.findAllByNameStudents(name);
错误方式:
<select id="findAllByNameStudents" resultType="com.zhixi.pojo.Student" parameterType="java.lang.String"> select * from STUDENT where STUDENT.NAME like '%#{name,jdbcType=VARCHAR}%' </select>
正确方式1:
<select id="findAllByNameStudents" resultType="com.zhixi.pojo.Student" parameterType="java.lang.String"> select * from STUDENT where STUDENT.NAME like '%${name}%' </select>
正确方式2:
<select id="findAllByNameStudents" resultType="com.zhixi.pojo.Student" parameterType="java.lang.String"> select * from STUDENT where STUDENT.NAME like concat(concat('%',#{name}),'%') </select>
正确方式3:
在调用处添加:"%"+name+"%"
<select id="findAllByNameStudents" resultType="com.zhixi.pojo.Student" parameterType="java.lang.String"> select * from STUDENT where STUDENT.NAME like #{name,jdbcType=VARCHAR} </select>
正确方式4:
<select id="findAllByNameStudents" resultType="com.zhixi.pojo.Student" parameterType="java.lang.String"> select * from STUDENT where STUDENT.NAME like "%"#{name}"%" </select>
4、java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSessionFactoryBuilder(类找不到)
创建的是一个普通的Maven,web项目,添加了Mybatis、Lombok、Junit、javax.servlet-ap、mysql-connector-java的依赖,确保这些依赖在你的右侧Maven中能看到
发生此异常的原因是没有找到jar包,在网上找了很多也没有找到有效的办法,回顾了之前的WEB开发,在IDEA中按照以下设置即可:
5、关于类加载的问题(获取SQLSession为null)
问题:
解决:
借用一波我认为比较正确的回答:
因为ClassLoader.getSystemClassLoader() 获得是ApplicationClassLoader
但是Tomcat 用的是WebappClassLoader(打破双亲委派),你想从ApplicationClassLoader实例上获取WebappClassLoader 上的资源是获取不到的。
可以使用Mybatis自带的工具类进行获取: new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
6、去除<sql></sql>标签中第一个字段波浪线爆红问题
虽说不影响程序,但是对于一个强迫症患者来说是非常头疼的,下面来说解决办法:
Maven
Process exited with an error: 1 (Exit value: 1)
WEB项目的部署
在我使用IDEA过程中,被Tomcat、Maven什么的本地配置,IDEA环境设置都踩过很多的坑,这里来记录一下,我们在部署WEB项目的时候需要注意哪些问题才能正确配置好一个web
- 1、打开项目结构设置(Ctrl+Alt+Shift+S)
- 2、设置对应的配置
tomcat指定即可:
Redis
序列化
在SpringBoot项目中整合Redis,报错:Could not read JSON: Cannot construct instance of `java.time.LocalDateTime`
搜索资料发现是因为在实体类中Date属性在被序列化时候出现的问题,在取出数据的时候,无法将时间格式的数据进行序列化
解决办法:在实体类属性加上 @JsonDeserialize 跟 @JsonSerialize
/** * 创建时间 */ @TableField(value = "create_time") @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime createTime;
渗透测试
使用到的抓包工具:Fiddler
错误信息泄露
https://ht.bjdj.gov.cn/%EF%BC%9Cc%3a%5cboot.ini
解决不显示Tomcat版本号问题,在Tomcat的conf/server.xml中<Host>标签中添加<Valve>标签
参数解释:
-
className:指定实现该阀门的Java类的完整类名。
-
errorCode.400:指定当发生400错误时,返回给客户端的错误页面路径(可以是相对路径/绝对路径)。
errorCode.0
来定义默认错误页。如果未找到匹配的错误页面,将返回默认的错误页面。-
showReport:指定是否在错误页面中显示报告,如果为false,则不显示报告。
-
showServerInfo:指定是否在错误页面中显示服务器信息,如果为false,则不显示服务器信息。
<Valve className="org.apache.catalina.valves.ErrorReportValve" errorCode.400="webapps/ROOT/400.html" showReport="false" showServerInfo="false" />
解决后:
Linux
yum
-bash: yum: 未找到命令/-bash: yum: command not found
查看是否有yum安装包(这里是没有的):rpm -qa |grep yum
1、下载阿里云的yum包
wget https://mirrors.aliyun.com/centos-vault/7.4.1708/os/x86_64/Packages/yum-3.4.3-154.el7.centos.noarch.rpm wget https://mirrors.aliyun.com/centos-vault/7.4.1708/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget https://mirrors.aliyun.com/centos-vault/7.4.1708/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-42.el7.noarch.rpm
2、执行安装
rpm -ivh yum*
Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
在执行:yum update更新yum源的时候出现了这个错误
解决办法:
yum clean all yum --disablerepo=epel -y update ca-certificates
No packages marked for update
更新yum源(所有): yum clean all && rm -rf /var/cache/yum/* && yum update
更新单个软件: yum update <package_name>
Docker
启动docker容器(WARNING: IPv4 forwarding is disabled. Networking will not work)
1、vim /etc/sysctl.conf #2、添加以下配置 net.ipv4.ip_forward=1 3、重启docker systemctl restart network && systemctl restart docker