SpringBoot学习笔记
常见问题
-
application和@PropertySource优先级
当使用@PropertySource引入自定义的properties时,如果自定义properties中的属性名和application.yml中存在重复,优先级application.yml>properties.
-
@Data注解自动生成getter&setter
//需要在pom.xml中引入lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
idea中需要下载lombok插件,这样Controller层才可以使用@Data生成的get/set方法
路径:Setting->Plugins->Search(Lombok)->install
-
@PropertySource引入自定义properties乱码
使用@PropertySource("classpath:properties",encoding="UTF-8");来更改字符集。
-
maven打包时一定要先将java文件进行编译
idea的maven-install时不会进行自动编译(不知道是否是我环境问题)
-
spring-boot-devtools自动重启
spring-boot-devtools只有在build重新编译时才会触发
-
每次设置完Source在改变配置后都会丢失配置
修改配置后报“Module xxx is imported from Maven.Any changes made in its configuration may be lost after reimporting”警告
原因分析:原因为Modules的编译JDK版本和Java默认的编译版本不一致造成
方法一:
更改Java默认编译版本,打开File—Settings—Build, Execution, Deployment—Java Compiler,修改Project bytecode version为8,Target bytecode version也修改成8。
方法二:修改pom.xml文件配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
-
Spring Boot扫描不到Controller注解的解决方法
1.主要原因
启动类和controller的位置关系不对。
2、解决方法
(1)官方推荐
保证:启动类和Controller有共同的父包。
(2)增加@ComponentScan注解
如果 启动类 和 controller 没有共同的父包,则需要在启动上增加@ComponentScan注解
@RestController
@SpringBootApplication
@ComponentScan("com.example")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
-
SpringBoot整合Mybatis莫名报MapperID重复异常
异常如下
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.example.springbootmybatis.mapper.IUserMapper.findAllUser
原因:由于在application.yml中配置了以下配置,该配置中的"mapper-locations"属性与"mybatis-config.xml"中的<mappers>功能冲突,导致springboot扫描了两次mapper所以出现MapperID重复异常。
#mybatis
mybatis:
config-location: classpath:config/WN_MyBatisConfig.xml # mybatis配置文件位置
mapper-locations: classpath:config/mappers/weavernorth/*.xml # mapper映射文件位置
type-aliases-package: com.example.springbootmybatis.entity # 别名包
解决方案:将application.yml中的“mapper-locations”属性删除或将"mybatis-config.xml"中的<mapper>删除。
-
Spring Boot 2.x对Redis的支持,最大的改变莫过于替换掉底层Jedis的依赖,替换成Luttuce
Lettuce
和 Jedis
的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例
-
Maven项目打jar包后读取静态文件
开发一个word模板书签替换功能,需要把word模板放resources下,在开发环境上直接写相对路径,可以正常访问,但在打jar包放服务器上,当然就找不到了。
InputStream inp = new FileInputStream("src/main/resources/templates/doctemplate/审批表.docx");
尝试获取绝对路径,也失败了:
String basePath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
InputStream inp = new FileInputStream(basePath + "templates/doctemplate/审批表.docx");
java.io.FileNotFoundException: file:\E:\Files\SpringCloud\模块1\target\salary-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\templates\doctemplate\审批表.docx (文件名、目录名或卷标语法不正确。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
jar包中resource下的文件是存在于jar这个文件里面,在磁盘上是没有真实路径存在的,它是位于jar内部的一个路径。因此无法用绝对路径获取到文件。
最终找到几个实现办法,大同小异都是读取文件流的方式获取:
InputStream inp = Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/doctemplate/审批表.docx");
ResourceLoader resourceLoader = new DefaultResourceLoader();
InputStream inp = resourceLoader.getResource("classpath:templates/doctemplate/审批表.docx").getInputStream();
ClassPathResource cpr = new ClassPathResource("templates/doctemplate/审批表.docx");
InputStream inp = cpr.getInputStream();
还要在项目pom.xml中配置resources情况,否则容易在IDE工具编译打包时,无法正确扫描resources路径出现异常。
<build>
<!-- 定义包含这些资源文件,能在jar包中获取这些文件 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<!--是否替换资源中的属性-->
<filtering>false</filtering>
</resource>
</resources>
</build>