6

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

奇怪的是这个错误并没有告诉我在哪个 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);
}
4

2 回答 2

1

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

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

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

你可以很确定 Spring 的基础设施 bean 不应该为此负责。Spring 是一个成熟的框架,在每个版本之前都投入了大量的工作并进行了测试。最明显的替代方案是,您忘记在代码中的某处指定class. 例如,您是否尝试制作 anabstract <bean>但忘记添加abstract="true"?您是否注册了 aBeanDefinitionParser并在没有 a 的情况下创建BeanDefinition了 s class?您是否创建BeanDefinitionPostProcessor和删除了BeanDefinition class值?

这些是我要开始的事情。

于 2014-06-05T05:34:39.837 回答
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;
    }
于 2014-06-05T05:36:11.040 回答