2010-11-26 13 views
9

私はautowireアノテーションでいくつかの問題があります。ここで春@Autowiredが動作しない

がコントローラである:

@Controller 
public class MyController { 
    @Autowired 
    @Qualifier("someService") 
    private SomeService someService; 

    .... 
} 

それは、サービス層です:これはアプリサービスです

public interface MyDAO{ 
    ....   
} 

@Repository 
public class JDBCDAOImpl implements MyDAO {  
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource dataSource;  
    .... 
} 

:層

public interface SomeService { 
    ... 
} 

@Service 
public class SomeServiceImpl implements SomeService{  
    @Autowired 
    @Qualifier("myDAO") 
    private MyDAO myDAO; 

    .... 
} 

そしてDAO私のアプリは、このようになります.xmlファイル:

.... 
<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="/WEB-INF/jdbc.properties" /> 

<bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.url}" 
     p:username="${jdbc.username}" 
     p:password="${jdbc.password}"/> 

<bean id="SomeService" class="com.service.SomeServiceImpl" />  
<bean id="myDAO" class="com.db.JDBCDAOImpl" />  

So ... Webアプリケーションを起動しているときにMyController Autowiresが正しく(SomeServiceImplクラスオブジェクトによって正しく注入されたsomeServiceフィールド)、someServiceのmyDAO feildにnull値(正しく挿入されていません)があります。

問題を見つけるのを手伝ってもらえますか?

P.S.面白いですが、myDAOから別のもの(例えばmyDAO2)に「bean id」を変更すると、システムは私にエラーをもたらし、bean myDAOが存在しないため注入ができなくなります。ですから、Springは注入を行いますが、それはどこにありますか?なぜそれが正しく動作しないのですか?

+0

は、なぜあなたはDAOでサービスと@Repositoryに@Serviceアノテーションを使用していませんか? – Javi

+0

はい...私はそれを使用します。編集...私のアプリは上記のコードより複雑なので、私はそれらを書くことを忘れてしまった。しかし、その場所のエラー。 – Ilnur

+5

@Repositoryアノテーションと@Serviceアノテーションを追加した場合、それらをxmlでBeanとして定義する必要はありません。 – Javi

答えて

9

解決策が見つかりました。 Javiが言ったように(Javiのおかげで)、DAOとサービス層のクラスに@Repositoryと@Serviceアノテーションを付ける必要があります。今、私はこのような書き込みをしようとしました:

@Service("someService") 
public class SomeServiceImpl implements SomeService{  
    @Autowired 
    @Qualifier("myDAO") 
    private MyDAO myDAO; 

    .... 
} 

@Repository("myDAO") 
    public class JDBCDAOImpl implements MyDAO {  
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource dataSource;  
    .... 
} 

、すべてが正常に動作します!!!

しかし、私はまだこの質問に対する答えは見つけられませんでした。アプリケーションがより複雑になり、@Repositoreと@Serviceアノテーションがいくつかのクラスに対して好都合でない複雑な構造を持つ場合、下位レベル(クラスのフィールドまたはクラスのフィールドのフィールド)に配置されています(@Autowireアノテーションはもちろんです)。あなたは、コントローラに@Controllerで行うよう

+8

@Componentはコントローラ、サービス、またはリポジトリではない別のコンポーネントに使用するものです – Javi

+0

OK。どうもありがとう!あなたは答えとしてあなたのコメントを置くことができます、私は私の質問の解決策としてそれをチェックします。 – Ilnur

+0

@Innurあなたがそれを見つけた人だから、あなたの答えは受け入れられたものにしてください。面白いと思ったらコメントをアップヴォートすることもできます:) – Javi

4

<context:annotation-config />と思われます。

+0

これはapp-servlet.xmlファイルにあります。何かこれを呼び起こす: Ilnur

+0

これは私の問題を解決しました。注釈を使用するにはannotation-configが必要です – SashikaXP

2
You can use 
<context:component-scan base-package="PATH OF THE BASE PACKAGE"/> entry your configuration .xml file. This entry will scan/read all the stareo type af annotations from the java classes . 
関連する問題