常犯的错误
1、在进行test测试时错误
- 在进行test测试时候,需要加载resources中的配置文件,则需要在test包重新导入一份,因为test无法访问到java中的resources文件
2、SpringBoot项目@tableid注解设置IdType.AUTO不生效的解决方法
- 我要做的就是将Mysql记录的自增值重置一下
- 先删除之前插入的那条脏数据
- 再在mysql数据库中执行:ALTER TABLE 库名.表名 AUTO_INCREMENT = 0;
3、log4j日志,test测试打印日志看不到问题
- 左侧找到具体的test方法,选中,则可以看到具体方法的debug日志
4、BeanUtils.copyProperties() 详解
- BeanUtils.copyProperties会进行类型转换;
- BeanUtils.copyProperties方法简单来说就是将两个字段相同的对象进行属性值的复制。如果 两个对象之间存在名称不相同的属性,则 BeanUtils 不对这些属性进行处理,需要程序手动处理。
- 这两个类在不同的包下面,而这两个类的copyProperties()方法里面传递的参数赋值是相反的。
一、 org.springframework.beans.BeanUtils
a拷贝到b
a,b为对象
BeanUtils.copyProperties(a, b);
二、org.apache.commons.beanutils.BeanUtils
b拷贝到a
a,b为对象
BeanUtils.copyProperties(a, b);
5、Test测试,mapper读取不到时,有可能是test引入包路径错误
平常引用的是import org.junit.Test;
新版本,JUint5,采用的是jupiter包import org.junit.jupiter.api.Test;
6、Docker容器中,项目启动正常,但是访问不到容器内的数据库,数据库远程连接正常,本地运行能连接,问题解决
经过排查,不是容器的问题,也不是docker网络的问题,也不是mysql的问题,也不是项目的问题,而是,防火墙开启,数据库3306端口设置状态为DROP,不是ACCEPT,所以,项目内部无法访问数据库,修改后,问题即可解决
解决方法:
7、Docker中mysql8.x版本容器部署后,项目中有些sql无法执行
经过排查,是因为sql模式的问题,发现从 MySQL 5.7.5 开始,默认 SQL 模式包括 ONLY_FULL_GROUP_BY。 (在 5.7.5 之前,MySQL 不检测函数依赖,并且默认不启用 ONLY_FULL_GROUP_BY)这可能会导致一些sql语句失效
# 通过 语句查询
select @@global.sql_mode
# 查询后 查询结果包括ONLY_FULL_GROUP_BY
#窗口临时修改 需要注意的是,该修改仅在该次(窗口)有效,只是临时修改
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
# 永久解决需要在my.cnf配置文件中添加一行配置 (这个配置有坑,mysql8.x版本不适用)
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 这个是正确配置
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# 修改完,重启mysql容器即可
在my.cnf配置完成之后,启动不成功,自定义配置文件一直不生效,启动报错 原因是,上述文档中,给的sql_mode
设置有问题,mysql8.x版本删除了NO_AUTO_CREATE_USER 已废除该模式
正确的设置为
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
mysql 8.0下的SELECT list is not in GROUP BY clause and contains nonaggregated column_51CTO博客_MySQL 8.0
8、后端项目解决跨域问题,前端没有进行跨域,无法访问后端项目接口
解决方法:第一种添加过滤器
package com.zf.common.security.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 后端解决跨域
*/
@Component
public class CrosFiter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, accessToken, token");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
前后端解决跨域五种方案_前后端跨域_努力的小白o的博客-CSDN博客
解决跨域第二种方式
package com.zf.common.security.filter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1. 添加 CORS配置信息
CorsConfiguration config = new CorsConfiguration();
// 放行哪些原始域
config.addAllowedOrigin("*");
// 是否发送Cookie
config.setAllowCredentials(true);
// 放行哪些请求方式
config.addAllowedMethod("*");
// 放行哪些原始请求头部信息
config.addAllowedHeader("*");
// 暴露哪些头部信息
config.addExposedHeader("*");
// 2. 添加映射路径
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**",config);
//3. 返回新的CorsFilter
return new CorsFilter(corsConfigurationSource);}
}
9、后端SpringBoot项目返回接口有乱码问题
方案一:properties文件中配置字符编码格式(强烈推荐)
properties文件中加入以下配置,强制指定Servlet编码格式为UTF-8:
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
# application.yml开发环境配置
server:
servlet:
encoding:
force: true
charset: UTF-8
方案二:注解@RequestMapping添加produces属性
在使用注解@RequestMapping、@GetMapping或者@PostMapping的时候,增加produces属性解决响应报文中文乱码问题:
@GetMapping(value ="/getResultById", produces = "application/json; charset=utf-8")
解决Spring Boot项目后端接口返回数据中文乱码问题 - 楼兰胡杨 - 博客园
10、for循环中,return结束循环,继续运行方法下面的内容
return在for循环中不起作用,我们如果要结束方法,不在进行下面内容的运行,可以 throw new RuntimeException("该信息重复添加,重复卡号:"+oldKaku.getCardNo());
comments powered by