spring-boot开发常见异常收录
jpa篇
1 异常一:缺少jpa数据源配置
异常描述:Cannot determine embedded database driver class for database type NONE
原因:该异常在spring-boot应用启动时候报异常。是因为maven依赖中依赖如了jpa,所以系统会自动配置试图注入jpa数据源。但是如果没又配置数据源,则会报该异常。
1.1 处理方法一
在pom中剔除jpa注入
<dependency>
<groupId>com.ymu.spcselling</groupId>
<artifactId>spcselling-infrastructure</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</exclusion>
</exclusions>
</dependency>
1.2 不传递依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<optional>true</optional><!--不在子应用中传递-->
</dependency>
1.3 在@SpringBootApplication中排除其注入
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
2 自动创建表指定Mysql搜索引擎类型
解决方法,只需要在配置文件添加如下代码:
# 指定生成表名的存储引擎为InneoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
启动类配置
1.让一个类型不被ComponentScan扫描
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
value = {ExcludeComponent.class})) //添加了@ExcludeComponent注解的类将不会被ComponentScan扫描
public class ServiceFileclientApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceFileclientApplication.class, args);
}
}
----
package com.ymu.servicefileclient.config;
public @interface ExcludeComponent {
}
-------
/**
* 该类为Feign的配置类
* 注意:该类不应该在主应用程序上下文的@CompantScan中
*/
@ExcludeComponent
@Configuration
public class FeignConfiguration {
/**
* 用feign.Contract.Default替换SpringMvcContract契约
*
* @return
*/
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
}
文件相关
1.在jar包所在目录下创建文件或者文件夹
//运行jar所在文件目录
@Value("${user.dir}")
private String userDir;
//创建文件夹abc
URI uri = URI.create(userDir);
File file = new File(uri + "/abc");
if (!file.exists()) {
file.mkdir();
}
2.系统用户根目录下创建文件
// 桌面路径
FileSystemView fsv = FileSystemView.getFileSystemView();
File com = fsv.getHomeDirectory();
// String url = com.getPath().replaceAll("\\\\", "\\\\\\\\") + "\\";
String filePath = com.getPath();
String fileName = "导出数据.pdf";
String uri = filePath.concat(File.separator).concat(fileName);
3.获取类所在资源目录
this.getClass().getClassLoader().getResource("").getPath();
--------------------------------------x
近期在用springboot封装一些对外服务的API接口,在本机测试都很顺利,可是当我打包jar文件放到服务器上测试的时候发现了类似下面的异常信息:
java.nio.file.NoSuchFileException: file:/app.jar!/BOOT-INF/classes!/xxx.properties
于是网上一番搜索,找到类似的解决方法:
Properties prop = new Properties();
InputStream is = this.getClass().getResourceAsStream(filePath);
取消自动配置
方式一
去掉pom中相关的依赖包。
代码中配置
1.使用了@EnableAutoConfiguration的时候
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
2.使用了@SpringBootApplication的时候
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
1
3.使用了@SpringCloudApplication的时候
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@SpringCloudApplication
4.通过配置文件来设置
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
1
spring boot tomcat临时文件夹的问题
The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/localhost/ROOT] is no
线上的系统中不能上传文件了,出现如下错误:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request;nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1337767218595042057.80/work/Tomcat/localhost/ROOT] is not valid
原因:
在linux系统中,springboot应用服务再启动(java -jar 命令启动服务)的时候,会在操作系统的/tmp目录下生成一个tomcat*的文件目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时/tmp目录下的文件,在长时间(10天)没有使用的情况下,就会被系统机制自动删除掉。所以如果系统长时间无人问津的话,就可能导致上面这个问题。
临时解决方法:
手动在/tmp下创建相应得文件夹或者重启系统
解决办法:
在 yml配置文件 中添加:
server.tomcat.basedir: /data/apps/temp
手动的将临时文件夹设置为自定义的文件夹,就不会被Linux删除了。
集成jooq后,添加aop切面,应用启动变慢的问题
问题描述:
spring boot2项目中,jpa集成jooq,添加切面,然后启动程序,每次都卡在初始化jpa的地方,要等待一两分钟甚至更久才能启动应用。
aop表达式:
@Before("execution(public * com.xrlj.servicesyscommon.service.impl..*.*(..)))")
启动会卡在这里:
2019-04-15 00:21:42.100 INFO 9072 --- [ restartedMain] log4jdbc.log4j2 : 2. Connection closed. {executed in 0ms}
2019-04-15 00:21:42.100 INFO 9072 --- [ restartedMain] log4jdbc.log4j2 : 2. Connection.close() returned
2019-04-15 00:21:42.122 INFO 9072 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'myself_db'
- 问题解决:
把execution表达式,改成within表达式即可。
改成:
@Before("within(com.xrlj.servicesyscommon.service.impl..*)")
即可。
参考:
网上描述,说是集成了jooq后才会这样的。
https://github.com/jOOQ/jOOQ/issues/5902