🍎细心亿点点-记录日常编码不容易注意到的小错误

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"

  1. 在xml文件中,分号;要用&表示!
  2. 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找一天~

  1. 使用&

SSM项目中解决乱码方案(尽量都配)

1、Tomcat

需要注意一点:tomcat 8后的版本是默认配置的,这是针对8以前的版本配置

  1. 找到Tomcat安装目录的conf找到Service.xml文件
  2. 修改<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文件的元素<>冲突,所以需要转义

符号原始字符转义字符
大于 > &gt;
大于等于 >= &gt;=
小于 < &lt;
小于等于 <= &lt;=
不等于 <>  &lt;&gt;
& &amp;
单引号 &apos;
双引号 " &quot;

或者使用CDATA 区段,所有 XML 文档中的文本均会被解析器解析。只有 CDATA 区段(CDATA section)中的文本会被解析器忽略:

大于等于 <![CDATA[ >= ]]>  
小于等于 <![CDATA[ <= ]]> 
不等于<![CDATA[ <> ]]>

2、JdbcType

在执行SQL时MyBatis会自动通过对象中的属性给SQL中参数赋值,它会自动将Java类型转换成数据库的类型。而一旦传入的是null 程序就无法准确判断这个类型应该是什么(是Integer?是VARCHAR?还是别的?),就有可能将类型转换错误,从而报错。

加入jdbcType正是为了解决这样的报错,需要针对这些可能为空的字段,手动指定其转换时用到的类型。

MybatisJdbcTypeOracleMySql
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

  

 

posted @ 2021-05-16 15:20  Java小白的搬砖路  阅读(245)  评论(1编辑  收藏  举报