QA展板
文章收录了自己在开发中遇到的各类问题的探究和解决方案。
# Q1:Spring-security本地可直接访问的接口线上访问接口却需要login的问题
排查 Spring-security 本地可直接访问的接口线上访问接口却需要 login 的问题
# 1)现象
本地:
/security/role/test
无权限接口本地访问可直接返回结果线上:
/security/role/test
无权限接口线上访问报401,跳转到login
# 2)排查
- 排查是否是线上环境问题:本地通过jar包方式启动,测试结果和线上一样。初步排除线上环境影响。
- 排查自定义Security配置是否生效:在自定义配置的方法中加入log日志。本地jar包启动未打印日志。确认是自定义Security配置未生效。
- 深入排查:
- 去除
so-security-starter
模块中的启动类,报repository找不到的错(去除启动类后,无法扫描到com.sleepy.security包下的repository) - 在
so-blog-service
模块的启动类中添加扫描so-security-starter
模块中的entity和repository的注解配置,正常运行。
- 去除
# 3)解决方案
- 去除
so-security-starter
模块中的启动类 - 在
so-blog-service
模块的启动类中添加扫描so-security-starter
模块中的entity和repository的注解配置
@EnableJpaRepositories(basePackages = {"com.sleepy"})
@EntityScan(basePackages = {"com.sleepy"})
...
1
2
3
2
3
# 4)原理解析
未完待续... ...
# Q2:实现了Serializable接口依然报NotSerializableException错
# 1)解决方案:
把实现Serializable的内部类提取到外部即可
# 2)一个栗子:
- 原始代码
public class House implements Serializable {
private String address;
private String area;
...
public class Room implements Serializable {
private String area;
private String owner;
...
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 提取内部类到外部
public class House implements Serializable {
private String address;
private String area;
...
}
1
2
3
4
5
2
3
4
5
public class Room implements Serializable {
private String area;
private String owner;
...
}
1
2
3
4
5
6
2
3
4
5
6
ps:不建议内部类实现Serializable接口
# Q3:JPA一对多双向映射,结果对象相互迭代造成堆栈溢出问题方法
# 1)问题
JPA 在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出(java.lang.StackOverflowError)。
# 2)分析
在后端向前端传递的时候会将数据序列化,转为json,这时会出现循环引用造成堆栈溢出
# 3)解决方案:
解决方法就是在==转换json时忽略循环字段==。首先确定项目使用的json包是哪一个(jackjson 或 fastjson),寻找相应的注解忽略某一字段。
jackson包对应的相关注解: @JsonIgnoreProperties
、@JsonIgnore
fastjson包对应的相关注解: @JSONField(serialize = false)
注意: 在使用注解时一定要注意引入的包是否正确,如果和自己使用的json包不对应的话,注解是不生效的。
附代码:
// 我的项目使用的alibaba的fastjson包
@Data
class SOStudent {
// ... ...省略其他字段
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name="classId")
@JSONField(serialize = false)
private SOClass class;
}
@Data
class SOClass {
@Id
@GeneratedValue
private Long id
// ... ...省略其他字段
@OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER)
private List<SOStudent> students;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Q4: idea 无法下载maven source的问题
确认是否是settings.xml中的仓库失效了。
如果没有失效则执行以下maven命令即可
mvn dependency:resolve -Dclassifier=sources
1
# Q5: 前端浏览器 navigator.clipboard is undefined,获取不到clipboard
需要在安全网络下进行才可以,localhost或者https,127.0.0.1是本机域名是安全的,所以可以获取到clipboard,谷歌现在很多api都是必须要求https的情况的
上次更新: 2021/12/28, 07:12:00