2011-09-20 33 views
24

auditRecordクラスのデフォルトコンストラクタを作成したくありません。SpringはすべてのBeanにデフォルトのコンストラクタが必要ですか?

しかし、春には、それを主張するようだ:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'auditRecord' defined in ServletContext resource 
[/WEB-INF/applicationContext.xml]: 
Instantiation of bean failed; 
nested exception is org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [com.bartholem.AuditRecord]: 
No default constructor found; 
nested exception is 
java.security.PrivilegedActionException: 
java.lang.NoSuchMethodException: 
com.bartholem.AuditRecord 

は、これは本当に必要ですか?

+0

Beanをロードし、あなたの設定を表示してください - XMLまたは注釈 – atrain

+0

https://stackoverflow.com/questions/25272543/no-default-constructor-found-nested-exception-is-java-lang-nosuchmethodexceptio – newday

答えて

1

あなたはこのようなもの(文書から取られたがhereを発見した)、すなわちコンストラクタベースの注入、

<bean id="foo" class="x.y.Foo"> 
    <constructor-arg ref="bar"/> 
    <constructor-arg ref="baz"/> 
</bean> 

を行うことができるかもしれないが、私はそれが動作するか分かりません。

JavaBeanを定義する場合は、この規則に従って、引数なしのpublicコンストラクタを置く必要があります。

28

いいえ、デフォルト(引数なし)のコンストラクタを使用する必要はありません。

Beanをどのように定義しましたか?あなたは、コンストラクタの引数を提供していませんでした

<bean id="AuditRecord" class="com.bartholem.AuditRecord"/> 

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <property name="someProperty" val="someVal"/> 
</bean> 

:あなたはこれらのいずれかのようなあなたのBean何かをインスタンス化するために春を告げていることのように聞こえます。前の例では、デフォルトの(またはargなしの)コンストラクタが使用されます。あなたは引数に取るコンストラクタを使用する場合は、そのようなconstructor-arg要素とそれらを指定する必要があります。

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <constructor-arg val="someVal"/> 
</bean> 

、あなたのアプリケーションのコンテキストで別のBeanを参照したい場合は、refを使用してそれを行うことができます属性valではなく、constructor-arg要素の属性

<bean id="AnotherAuditRecord" class="com.bartholem.AuditRecord"> 
    <constructor-arg ref="AnotherBean"/> 
</bean> 

<bean id="AnotherBean" class="some.other.Class" /> 
18

ニコラス答えは、XML構成のためのお金を右です。私はちょうどそれを行うにははるかに自然な方法です、あなたの豆を設定するには、注釈を使用した場合、それはコンストラクタ・インジェクションを行うことだけではなく、単純だということを指摘したいと思います:

class Foo { 
    private SomeDependency someDependency; 
    private OtherDependency otherDependency; 

    @Autowired 
    public Foo(SomeDependency someDependency, OtherDependency otherDependency) { 
     this.someDependency = someDependency; 
     this.otherDependency = otherDependency; 
    } 
} 
+1

私はそれに少し問題があります。このアノテーションはアプリケーションの一部で機能しますが、テストでは引数なしのコンストラクタエラーが発生します。引数を挿入したりデフォルトのコンストラクタを追加せずに解決する方法があるかどうか教えてください。 –

+0

@ジョンドー:本当に古い答えにコメントを投稿するのではなく、新しい質問をする必要があります。また、それがあなたの質問にあるなら、あなたは良い答えを得るつもりはありません。問題を示すために、適切なスタックトレースとサンプルコードを含めます。 [SSCCE](http://sscce.org/)を参照してください。 [How To Ask](http://stackoverflow.com/questions/how-to-ask)も参照してください。 –

+0

あなたはおそらく正しいです、私は投稿を作成することを検討します。 –

関連する問題