【问题标题】:Spring Boot DevTools initialization errorsSpring Boot DevTools 初始化错误
【发布时间】:2017-03-13 15:25:57
【问题描述】:

想尝试Spring Boot DevTools(用于热重载的库),但在将其包含在我们的项目中后遇到了一些问题。 带有@Lazy 字段的bean 正在提高BeanCreationException:

创建名为“project.specific.Bean”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.aop.framework.AopConfigException:无法生成类 [class project.specific.Factory] ​​的 CGLIB 子类:此问题的常见原因包括使用最终类或不可见类;嵌套异常是 org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null

project.specific.Bean 看起来像这样

@Component
public class Bean ... {
    ...
    @Autowired
    @Lazy
    private Factory factory;
    ...
}

我用 Spring Boot Athens 和 Brussels 尝试了 DevTools,结果相同。

在简单地删除 @Lazy 之后,@Repository 也出现了一些问题,我刚刚将其替换为 @Component(仅在雅典尝试过)。

之后还有这个很奇怪的问题:

java.lang.ClassCastException: project.specific.Product 不能转换为 project.specific.Product

显然我不想删除@Lazy 并将@Repository 替换为@Component,但也许我做错了什么?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    可能是spring dev工具重启类加载器引起的。
    参考Automatic restart的文档

    Spring Boot 提供的重启技术通过使用两个 类加载器。不变的类(例如,来自 第三方 jars)被加载到基类加载器中。类 您正在积极开发的内容被加载到重启类加载器中。

    这意味着,您的某些类是由不同的类加载器(重新启动类加载器或基类加载器)加载的。
    如果类是由不同的类加载器加载的,它会识别为不同的类(bean)。

    这就是为什么您的项目无法自动装配 bean 并且即使在相同的类之间也发生 ClassCastException。

    解决方法是here

    您可以通过 spring-devtools.properties 选择哪个类加载器将显式加载您的类。

    【讨论】:

    • 你的意思是我需要排除一些类/库,以便它们被“基础”类加载器加载?但是我对@Lazy 和@Repository 的问题来自罐子,应该排除在外。
    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多