🍎细心亿点点-记录日常编码不容易注意到的小错误
SpringBoot
关于application.yml中Mybatis映射器位置说明
1 2 3 | 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路径下查找资源
1 2 3 4 5 6 7 | 举个例子,假设我们有一个项目,其中有两个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传递数据的时候,需要单独对此类型进行处理:
1 2 3 4 5 6 7 8 9 | /** * 创建时间 */ @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,不出所料出现了乱码
两种解决办法:
第一种:写过滤器
1 2 3 4 5 6 7 8 9 10 11 | @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中设置
1 2 3 4 5 6 | #客户端请求的 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
1 2 3 4 | 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中配置过滤器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <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中设置
1 2 3 4 5 6 7 8 9 10 11 12 | <!--启用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代码设置
1 2 3 | /*设置编码*/ 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)中的文本会被解析器忽略:
1 2 3 | 大于等于 <![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);
错误方式:
1 2 3 4 5 | <select id= "findAllByNameStudents" resultType= "com.zhixi.pojo.Student" parameterType= "java.lang.String" > select * from STUDENT where STUDENT.NAME like '%#{name,jdbcType=VARCHAR}%' </select> |
正确方式1:
1 2 3 4 5 | <select id= "findAllByNameStudents" resultType= "com.zhixi.pojo.Student" parameterType= "java.lang.String" > select * from STUDENT where STUDENT.NAME like '%${name}%' </select> |
正确方式2:
1 2 3 4 5 | <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+"%"
1 2 3 4 5 | <select id= "findAllByNameStudents" resultType= "com.zhixi.pojo.Student" parameterType= "java.lang.String" > select * from STUDENT where STUDENT.NAME like #{name,jdbcType=VARCHAR} </select> |
正确方式4:
1 2 3 4 5 | < 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
1 2 3 4 5 6 7 | /** * 创建时间 */ @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,则不显示服务器信息。
1 2 3 4 5 | <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包
1 2 3 | 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、执行安装
1 | rpm -ivh yum* |
Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
在执行:yum update更新yum源的时候出现了这个错误
解决办法:
1 2 | 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 2 3 4 5 6 7 | 1、vim /etc/sysctl.conf #2、添加以下配置 net.ipv4.ip_forward=1 3、重启docker systemctl restart network && systemctl restart docker |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话