0

私はジェネリックDAOでSpring 3.0を使用しています。私はこれを持っています:

public interface GenericDAO<T, ID extends Serializable>
...
@Repository("genericDAO")
public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {
...
public interface A extends GenericDAO<Turno, Long> {
...
public interface B extends GenericDAO<TipoTurno, Long> {
...
@Repository("A")
public class AImpl extends GenericDAOImpl<TipoTurno, Long>  implements A{
...
@Repository("B")
public class BImpl extends GenericDAOImpl<TipoTurno, Long>  implements B{

しかし、次のように注入しようとすると:

@Autowired
A a;

私は得る:

単一の一致する Bean が期待されていましたが、3 つ見つかりました: [genericDAOImpl, A, B]

理由がわかりません。私もそれをやってみました

@Resource(name="A")

そしてさえ

@Resource(type=A.class)

@Qualifier も使用してみましたが、常に同じ例外が発生します。Spring は特定のクラスではなく、常に GenericDao を探しているようです。

しかし、まだ機能していません。そして、私はその理由を理解できません。

助言がありますか?

どうもありがとうございました。

4

2 に答える 2

1

正確なエラー メッセージを再現し、修正しました。これは、私が使用したソースコードからパッケージ名を除いたものです。コピーして実行し、自分のものと比較することをお勧めします。私が気付いた違いの 1 つは、質問に書かれているように、AImpl がコンパイルされないことです。GenericDAOImpl と GenericDAO の両方を実装しています。最初のジェネリック パラメータを Turno に変更して、コンパイルできるようにしました。これはタイプミスだったと思います。最初にすべてのフィールドを @Autowired に設定したときのエラーを正確に再現しました。次に @Qualifier("genericDAO") を追加すると、3 つすべてが正常に接続されました。

public interface GenericDAO<T, ID extends Serializable> {}
...
@Repository("genericDAO")
public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {}
...
public interface A extends GenericDAO<Turno, Long> {}
...
public interface B extends GenericDAO<TipoTurno, Long> {}
...
@Repository("A")
public class AImpl extends GenericDAOImpl<Turno, Long> implements A {}
...
@Repository("B")
public class BImpl extends GenericDAOImpl<TipoTurno, Long>  implements B {}
...
public class TipoTurno {}
...
public class Turno {}
...
@Component
public class Thingy {
    @Autowired
    private A a;

    @Autowired
    private B b;

    @Autowired
    @Qualifier(value="genericDAO")
    private GenericDAO genericDao;
}
...
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("genericdao.xml");
        context.getBean(Thingy.class);
    }
}
...
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:annotation-config/>
    <context:component-scan base-package="genericdao"/>
</beans>

実際のエラー メッセージは、指定したものよりも長いことに注意してください。原因を探して全体を読むことが重要です。Spring は、原因のレベルが 5 つ、場合によっては 10 レベルある例外スタック トレースを好みます。ここに私が得るメッセージの関連する部分文字列があります:

フィールドを自動配線できませんでした: genericdao.GenericDAO genericdao.Thingy.genericDao; ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: タイプ [genericdao.GenericDAO] の一意の Bean が定義されていません: 単一の一致する Bean が予想されますが、3 が見つかりました: [A, B, genericDAO]

これは、オートワイヤーされていないフィールドがThingy.genericDaoではなく であったことを示していThingy.aます。これはあなたのエラーにも当てはまると強く思います。

于 2012-06-19T01:46:11.363 に答える
0
@Repository("AImpl")
public class AImpl extends GenericDAOImpl<TipoTurno, Long>  implements A{
...
@Repository("BImpl")
public class BImpl extends GenericDAOImpl<TipoTurno, Long>  implements B{
...
@Resource(name = "AImpl")
A whatever; //I would normally call it aImpl

修飾子の名前が一致している限り、問題はありません。このエラーは、インターフェイスが 2 回実装されているインジェクションの自動配線によって発生します。

于 2012-06-18T12:14:05.760 に答える