【问题标题】:No bean class specified on bean definition没有在 bean 定义上指定 bean 类
【发布时间】:2014-06-05 04:15:19
【问题描述】:

很抱歉,这可能是一个过于模糊和笼统的问题。我正在尝试用大量的弹簧接线提出一个巨大的遗留项目,但我收到了这个错误:

奇怪的是这个错误并没有告诉我在哪个 xml、哪个 bean id 上发生了错误。

我当然不希望有人指出我在哪里修复。我的问题是,spring 专家如何调试这种无信息的错误消息?

是的,我知道这一定是我的 xml bean 之一设置错误。但是错误消息不应该让我更容易找出哪个bean吗?

任何建议将不胜感激。

00:09:00.640 [main] ERROR com.xxxx.yyyy.zzzzzz.AppMain - Failed to initialize BLAH BLAH BLAH
java.lang.IllegalStateException: No bean class specified on bean definition
        at org.springframework.beans.factory.support.AbstractBeanDefinition.getBeanClass(AbstractBeanDefinition.java:381) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:154) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1035) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:939) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]

它是由下面的一段代码抛出的。 init() 方法接收 spring xml 文件并进行连接。

try {
    AppMain.init(args_);
} catch (Exception e) {
    _LOGGER.error("Failed to initialize BLAH BLAH BLAH", e);
    System.exit(-1);
}

【问题讨论】:

  • 这些是唯一的堆栈跟踪元素吗?
  • @SotiriosDelimanolis 对不起,我不确定你的意思。这些来自我的日志末尾。
  • @CodeNoob 请在日志中发布顶部(相关外观)堆栈跟踪...而不是底部。
  • @ElliottFrisch 这真的已经是第一了。
  • 是结束,还是顶部?如果这是顶部,请配置额外的日志记录。

标签: java spring spring-bean


【解决方案1】:

这是失败的部分来源 您可以尝试在异常抛出中设置断点。或者添加spring代码而不是jar文件并尝试在那里调试。

public Class<?> getBeanClass() throws IllegalStateException {
        Object beanClassObject = this.beanClass;
        if (beanClassObject == null) {
            throw new IllegalStateException("No bean class specified on bean definition");
        }
        if (!(beanClassObject instanceof Class)) {
            throw new IllegalStateException(
                    "Bean class name [" + beanClassObject + "] has not been resolved into an actual Class");
        }
        return (Class) beanClassObject;
    }

【讨论】:

    【解决方案2】:

    我的问题是,spring 专家甚至如何调试这种 没有信息的错误消息?

    我认为错误消息非常有用。它指出某些东西试图使您的应用程序处于非法状态。在这个特定的示例中,您的上下文以未指定某些 bean 类的方式配置。这通常是由于忘记将class 属性放在&lt;bean&gt; 声明中造成的。

    Spring 为上下文中的每个 bean 创建 BeanDefinition 对象。这些可以来自您的&lt;bean&gt; 声明或其他XML 元素或Java 配置元素(来自@Configuration、@Component 等)。 Spring ApplicationContext 中涉及的几乎所有内容都是 bean。

    您可以肯定 Spring 的基础设施 bean 不应该为此负责。 Spring 是一个成熟的框架,在每个版本之前都投入了大量的工作并进行了测试。显而易见的替代方案是,在您的代码中的某处您忘记指定class。例如,您是否尝试创建abstract &lt;bean&gt; 但忘记添加abstract="true"?您是否注册了BeanDefinitionParser 并创建了没有class 的BeanDefinitions?您是否创建了 BeanDefinitionPostProcessor 并删除了 BeanDefinition class 值?

    这些是我要开始的事情。

    【讨论】:

    • 是的,但是您不认为应该有一种更简单的方法来找出哪个bean?
    • 我正面临着一个同样不透明的无益消息,Grails 是基于 Spring 构建的。我已经使用 Spring 很多年了,尽管知道 IoC 的原理对于简单的示例来说似乎非常清楚,但我仍然花了几天时间试图找出为什么容器不会实例化 bean
    • @user1561783 有什么我可以帮忙的吗?
    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2016-06-28
    • 2016-01-12
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多