2013-05-20 18 views
5

私はコード@Injectを持っていますが、他のクラスでは動作しません。春の注釈@Injectは機能しません

  • のcontext.xml
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
    ... 
} 

UserDAOクラスがcom.myfashions.daoパッケージ内に存在している

<?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.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        "> 
    <bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> 
    <context:component-scan base-package="com.myfashions.services"/> 
    <context:component-scan base-package="com.myfashions.dao"/> 
</beans> 
  • SellerRetriever.java: はここに私のコードです。 @InjectがSeller.javaで動作していません。理由は何ですか?

+1

'Seller'クラスはSpringで管理されていますか?あるいは、 'new'演算子でそれを作成していますか? –

+1

ありがとう@ nicholas.hauschild私は私の間違いを知った。私は新しい演算子でそのオブジェクトを作成しました。だから私はすべてのインジェクションを取得した理由はnullです – vicky

+0

'@ Inject'は春の注釈ではありません – ACV

答えて

2

私は場合には、誰もが同じ問題を抱えているので、私はこれを掲示しています、私のミスを発見しました。私はSellerRetriverオブジェクトを作成するためにnew演算子を使用しました。 new演算子を使用してその特定のクラスを呼び出すと、注入は機能しません。

3

するスキャンする資格を得るには、あなたのクラスは、あなたのケースでは...もっと汎用的な@Component、または@Serviceまたは@Repositoriesなどのいずれかで@Service論理的に、より良いフィットを注釈を付けなければなりません。 これで、必要に応じて、サービスコールに特化したいくつかの側面(AOP)を定義できます。

さらに、@Injectの代わりに@Autowiredを使用してBeanを取得することができます。これら二つのアノテーションに関する相違点の詳細については

What is the difference between @Inject and @Autowired in Spring Framework? Which one to use under what condition?

とあなただけの代わりに@Inject@Autowiredを維持するための一つの良い理由を説明するの下に私のコメントを見ることができます。

+0

それは素晴らしい答えですが、まだNullPointerExceptionを取得しています。 – vicky

+0

私はあなたがSpring 3を使っている限り、 '@Iject'または' @ Autowired'を 'component-scan'と組み合わせて使うことができると考えました。 – Jonathan

+0

クラスの上に@Componentまたは@ Serviceまたは@ Repositoriesを追加してくださいそれ以外の場合はスキャンされません。 – Mik378

7

SellerRetrieverUserDAOの実装の両方に、コンポーネントスキャンの注釈が付いていることを確認してください。これは、後者が前者に注入されることを保証する。

@Service 
public class SellerRetriever { 
    @Inject 
    UserDAO userDAO; 
    ... 
} 

注釈@ComponentUserDAO実装。

スキャンする複数のパスを使用します。

<context:component-scan base-package="com.myfashions.services, com.myfashions.dao"/> 
+1

他のサービスクラスではUserDAOが注入されていますが、SellerRetriever.javaには注入されていません – vicky

+1

'com.myfashions.services'に' SellerRetriever'と仮定します。アプリケーションコンテキストで単一のコンポーネントスキャンタグを使用してみてください – Reimeus

+0

@Reimeusこれは興味深い提案です。春は最初のコンポーネントスキャンを行い、 'UserDAO'を見逃すことができますか?それは2番目のコンポーネントがスキャンするまで周囲を回らないためですか? – davidfmatheson

関連する問題