2016-10-07 20 views
1

私は春が初めてのので、どのように動作するのか理解しようとしています。私は、休止状態のフレームワークを管理するためのスプリングを使用した簡単なサーブレットプロジェクトを開発しました。サービススプリングでNullPointerExceptionが発生する

私はサービス

@Service("service") 
@Transactional 
public class CdServiceImpl { 

    @Autowired 
    private HibernateUtility hibernateutility; 

    public int saveCd(CD cd) { 
     return hibernateutility.saveCd(cd); 
    } 

    public List getCd(String searchedCd) { 
     return hibernateutility.getCd(searchedCd); 
    } 

    public List getAllCd() { 
     return hibernateutility.getAllCd(); 
    } 

    public void deleteCd(int id) { 
     hibernateutility.deleteCd(id); 
    } 

    public User getUser(String username, String password) { 
     return hibernateutility.getUser(username, password); 
    } 
} 

を持っている。そして、私はそれが動作しますが、私は2つの質問があります)

context.scan("it.project"); 
    context.refresh(); 
    CdServiceImpl service = (CdServiceImpl) context.getBean("service"); 
    context.register(ApplicationContextConfig.class); 
    context.refresh(); 

1のサーブレットでそれを使用しています。それは正しい方法ですか? 2)私のようなサーブレットでフィールドを設定しようとしました:

@Autowired 
    private CdServiceImpl service 

、その後、私はcontext.scan ECC部分を除去し、それは私にはNullPointerExceptionを与えました。どうして?

は、それが動作しませんなぜ私はまた、新しいBean

@Bean 
    public CdServiceImpl getCdServiceImpl() { 
     return new CdServiceImpl(); 
    } 

を定義したことを行いますか?これはノブの質問かもしれないことは知っているかもしれませんが、私は春の仕組みを理解しようとしています

+0

あなたがSpringファイルで定義を提供していない場合、新しいキーワードを使用して初期化する必要があります。 – Nimesh

+0

(私は注釈を使用しています)私の設定ファイルでは、Beanを定義しました!私の質問の最後の行を参照してください – untruste

+0

1.それはないです。 2.サーブレットは春には管理されないため、依存関係を注入することはできません。 –

答えて

0

基本的にnew **ApplicationContextのようなことをやってすぐに頭を傷つけ、あなたは本当にこれをしたいです。 99%のケースでは、これはあなたが望むものではなく、少なくとも行うべきものではありません。

代わりにContextLoaderListenerに設定をロードしてください。 web.xmlがないと仮定すると、AbstractContextLoaderInitializerベースクラスが使用されます。

public ApplicationInitializer extends AbstractContextLoaderInitializer { 


    protected WebApplicationContext createApplicationContext() { 
     return new AnnotationConfigWebApplicationContext(ApplicationContextConfig.class); 
    } 

} 

注:このようあなたはコンテキストを作成する必要があるアプリケーションをブートストラップするためです。 AbstractAnnotationConfigDispatcherServletInitializerを使用してこの必要性を排除することもできますが、必要のないDispatcherServletも作成します。

設定が自動的にロードされたので、WebApplicationContextUtilsを使用してルックアップを実行するコンテキストを取得できます。サーブレットのinitメソッドでこれを行います。

public class YourServlet extends GenericServlet { 

    private CdServiceImpl service; 

    public void init() throws ServletException { 
     ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 
     service = ctx.getBean(CdServiceImpl.class); 
    } 
} 

これで、Beanを一度初期化してもう何も処理する必要はありません。また、@Autowiredを使用して、手動で注入することもできます。このコンポーネントスキャン春を使用すると、シングルトンBeanを作成しますので、あなたが明示的にXMLファイルにあなたの豆を宣言していないと、そうでない場合は、新しいキーワードを使用して、それを初期化する必要はありません理由です場合、コンテキストスキャンが必要とされて

public class YourServlet extends GenericServlet { 

    @Autowired 
    private CdServiceImpl service; 

    public void init() throws ServletException { 
     ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 
     ctx.getAutowireCapableBeanFactory().autowireBean(this); 
    } 
} 
+0

しかし、最初のクラス、私はそれを置く必要がある私の構成を読み込むもの?私はどこかで "createApplicationContext()"を呼び出さなければなりませんか? (申し訳ありませんが、私のための新しい世界です) – untruste

+0

いいえ...サーブレットコンテナはそれを呼び出すでしょう...あなたがサーブレット3.0コンテナを使用していて、 'web.xml'またはサーブレット3.0がないと仮定すると'web.xml'です。 –

関連する問題