6

申し訳ありませんが、これはおそらくあまりにも漠然とした一般的な質問です。大量のスプリング配線を含む巨大なレガシー プロジェクトを立ち上げようとしていますが、次のエラーが発生します。

奇妙なことに、このエラーは、どの xml、どの Bean ID、エラーが発生したかを教えてくれません。

私は確かに誰も私にどこを修正すべきかを指摘することを期待していません..私の質問は、春の専門家がこの種の有益でないエラーメッセージをどのようにデバッグするのですか?

はい、私の xml Bean の 1 つが間違って設定されているに違いないことは理解しています。しかし、エラー メッセージによってどの 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

私の質問は、スプリングの専門家がこの種の有益でないエラー メッセージをどのようにデバッグするのかということです。

エラーメッセージは非常に有益であると私は主張します。何かがあなたのアプリケーションを違法な状態にしようとしたことを示しています。この特定の例では、一部の Bean のクラスが指定されていない方法でコンテキストが構成されています。これは通常、宣言classに属性を入れ忘れたことが原因です。<bean>

Spring はBeanDefinition、コンテキスト内の各 Bean のオブジェクトを作成します。これらは、<bean>宣言または他の XML 要素または Java 構成要素 ( 、 など) から取得でき@Configurationます@Component。Spring に関係するほとんどすべてApplicationContextが Bean です。

これは、Spring のインフラストラクチャ Bean のせいではないと確信できます。Spring は確立されたフレームワークであり、多くの作業が行われ、すべてのリリース前にテストが行​​われます。すぐに明らかな代替手段は、コードのどこかでclass. たとえば、 を作成しようとして、abstract <bean>を追加するのを忘れましたabstract="true"か? を登録し、なしBeanDefinitionParserで を作成しましたか? 値を作成および削除しましたか?BeanDefinitionclassBeanDefinitionPostProcessorBeanDefinition class

それらは私が始めるものです。

于 2014-06-05T05:34:39.837 に答える
1

それは失敗するソースの一部です。例外スローでそこにブレークポイントを設定しようとすることができます。または、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 に答える