首页 > 技术文章 > 最近走过的坑 :slf4j 多个实现 hibernate 类型转换异常 bean依赖问题

stdpain 2019-05-27 10:14 原文

最近走过的坑

slf4j 多个实现

主要是maven依赖中存在多个slf4j的实现类,在引入的依赖中排除对应的依赖就可以

<dependency>
    <groupId>xxxxxx</groupId>
    <artifactId>xxxxxx</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

另外对于spring-boot来讲,可以这样排除,子项目就可以不用排除了,不过log-back还算好用,个人更喜欢用spring-boot全家桶

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

hibernate 在启动的时候死锁

主要排查: 1.账号密码这些问题 2.有的时候抛一些关于c3p0的异常,把这个c3p0换一个比较新的就好了
参考:https://stackoverflow.com/questions/18100414/c3p0-apparent-deadlock-exception

<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

hibernate 类型转换异常

描述:在spring boot中手动配置hibernate,hibernate在返回的时候可能会抛出一个类型转换异常,比如User不能转换为User

去掉 spring-boot-dev 这个依赖就好了,原因未知(原因可能是类加载器不同,以后再研究)

https://stackoverflow.com/questions/42767378/spring-boot-devtools-initialization-errors/42804019#42804019
如果迫切需要解决,可以看下这个
https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-customizing-classload

bean依赖问题

有的时候一个bean依赖另一个bean(最简单的情况就是,一个bean在构造方法中需要调用另一个bean,这个时候可能有些bean没有初始化)

@Service
@DependsOn(value = "mysqlClient")
public class XXXServiceImp implements XXXService

解决方案:加一个注解即可@DependsOn(value = "beanname")要注意的是,不要有循环依赖比如说 a->b b->c c->a 这种的

另一种解决方案就是构造方法注入在给构造方法加一个自动注入的注解

@Autowired
public XXXServiceImp(XXXDao xxxDao)

推荐阅读