SpringBoot 笔记
以下是个人遇到SpringBoot问题及其他特殊用法~
SpringBoot 添加Banner图输出
resources
目录下新建一个banner.txt
文件, https://www.bootschool.net/ascii 生成ASCII艺术字
SpringBoot 同一个项目用不同端口启动
- 在工具栏上选择
Edit Configurations
-> 添加新的配置 - 并选择
Spring Boot
添加新的配置,并选择Spring Boot
- 然后在
Main class
中选择我们的启动类,在VM options
填写-Dserver.port=9800
SpringBoot 整合Spring Security报错
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Illegal overloaded getter method with ambiguous type for property enabled in class class com.springboot.security.entity.User. This breaks the JavaBeans specification and can cause unpredictable results.
原因:在做用户登录的时候,通常我们会判断当前账号是否可用,将这个属性设置为Boolean类型。而我们定义好的类需要实现UserDetails 接口来规范用户属性,然后重写里面的方法来判断当前的用户是否可用。这时候重写的isEnabled方法就会跟Mybatis自动生成的getEnabled方法同时存在。
解决方法:因为isEnable相当于getEnable,导致JavaBean里面有两个getEnabled方法,违反了JavaBean的规范,只要将其中一个删掉就可以了
SpringBoot 项目一启动就结束
项目依赖缺失:特别是缺少spring-boot-starter-web依赖。这可能是由于在父模块(如jpa-db-demo)中未正确配置依赖,或者在依赖的其他模块中没有正确引入spring-boot-starter-web。
其他依赖问题:如果项目中还依赖了其他模块,而这些模块中没有正确配置spring-boot-starter-web,也可能导致项目启动后立即停止。
程序代码错误:检查程序代码是否有未检测的错误,这可能导致程序无法正常运行。 配置文件问题:检查是否在配置文件中指定了不正确的参数或配置。
缺少必要的依赖项:尽管这不是一个具体的原因,但有可能是由于缺少某些必要的依赖项导致的。
StringRedisTemplate 和 RedisTemplate 的区别
StringRedisTemplate
和RedisTemplate
都是Spring Data Redis中的类,用于在Spring应用中方便地进行Redis操作。它们有一些区别,主要表现在序列化策略、关系和数据共享方面。
关系:StringRedisTemplate继承自RedisTemplate,这意味着StringRedisTemplate拥有RedisTemplate的所有功能,并在此基础上进行了一些改进。
序列化策略:StringRedisTemplate使用String的序列化策略,而RedisTemplate使用JDK的序列化策略。这意味着在存储和检索数据时,两者可能使用不同的序列化方式。
数据共享:由于序列化策略的不同,StringRedisTemplate只能管理StringRedisTemplate中的数据,而RedisTemplate只能管理RedisTemplate中的数据。这意味着两者之间的数据是不共享的。
StringRedisTemplate
:只能存储String类型的值,因此不能存储如对象,序列化为String,为原字符串。 RedisTemplate
:可以存储任意类型,含对象。序列化采用jdk的,如:\xAC\xED\x00
控制层写单元测试
@SpringBootTest
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
class AccountControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void createToken() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/api/backstage/account/createToken")
.param("subject", "admin")
.contentType("application/json;charset=UTF-8")
.accept("application/json;charset=UTF-8"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(200))
.andExpect(MockMvcResultMatchers.jsonPath("$.data").isNotEmpty())
.andDo(MockMvcResultHandlers.print());
}
}
mockMvc.perform
执行一个请求 MockMvcRequestBuilders.get(“/selectByName?id=3”)
构造一个请求,Post请求就用.post方法 contentType("application/json; charset=utf-8")
代表发送端发送的数据格式是application/json;charset=UTF-8
accept(""application/json; charset=utf-8"")
代表客户端希望接受的数据类型为application/json;charset=UTF-8
ResultActions.andExpect
添加执行完成后的断言 ResultActions.andExpect(MockMvcResultMatchers.status().isOk())
方法看请求的状态响应码是否为200如果不是则抛异常,测试不通过 andExpect(MockMvcResultMatchers.jsonPath(“$.name”).value("张三"))
这里jsonPath用来获取name字段比对是否为张三,不是就测试不通过 ResultActions.andDo
添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()
输出整个响应结果信息