2016-06-25 16 views
0

私は@ControllerにここServletContextListenerの私の実現の程度春とのServletContextListener

@Autowired 
ServletContext context; 

をいくつかの記事や記事をお読みください。しかし、私はそれを実行すると長い例外があります:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'trendsoftCtrl': 
Unsatisfied dependency expressed through field 'context': 
No qualifying bean of type [javax.servlet.ServletContext] found for dependency [javax.servlet.ServletContext]: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. 
Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)}; 
nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [javax.servlet.ServletContext] found for dependency [javax.servlet.ServletContext]: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)} 

私のクラスはここにあります。

@WebListener 
public class TRSCListner implements ServletContextListener { 

@Override 
public void contextInitialized(ServletContextEvent event) { 
    ServletContext context = event.getServletContext(); 
    String beanFileName = context.getInitParameter("springBeans"); 

    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); 
    ctx.load(beanFileName); 
    ctx.refresh(); 
    NewsDao newsDao = ctx.getBean("newsDao", NewsDao.class); 

    context.setAttribute("appContext", ctx); 
    context.setAttribute("dao", newsDao); 
} 

@Override 
public void contextDestroyed(ServletContextEvent event) { 
    ServletContext context = event.getServletContext(); 
    GenericXmlApplicationContext ctx = (GenericXmlApplicationContext) context.getAttribute("appContext"); 
    ctx.close(); 
} 

} 

、デフォルトでは他の

@Controller 
public class TrendsoftCtrl { 

@Autowired 
ServletContext context; 

@RequestMapping ("/welcome") 
public ModelAndView helloWorld() { 
    NewsDao newsDao = (NewsDao) context.getAttribute("dao"); 
    List<News> news = newsDao.getAll(); 

    StringBuilder message = new StringBuilder(); 

    for (News n : news) { 
     message.append(n.getCategory().getName() + "<br>"); 
     message.append(n.getName() + "<br>"); 
     message.append(n.getData() + "<br><br>"); 
    } 

    return new ModelAndView("welcome", "news", message.toString()); 
} 

public ServletContext getContext() { 
    return context; 
} 

public void setContext(ServletContext context) { 
    this.context = context; 
} 

} 
+0

なぜあなたはあなたのコントローラに 'ServletContext'を注入しますか?これは、Springが設計していたルーズカップリングのアイデアを破るものです。 DAOクラスをスタンドアロンBeanとして宣言し、ルートコンテキストとサーブレットコンテキストを適切に設定する必要があります。 Spring Javaの設定を使用してみてください(このリンクを例として参照してください):http://www.mkyong.com/spring-mvc/gradle-spring-4-mvc-hello-world-example-annotation/任意のbeanを 'ServletContext'に手動で入れてください –

+0

Ok。しかし、私はそこにリスナーについて何も表示されません – R1K0

+0

なぜカスタムリスナーを使用していますか?あなたのリスナーのコンテキストにいくつかの豆を置くように見えます。コンテキストとのやりとりを避けることができます。ちょうどSpringを使用してください。これらのBeanを宣言的に構成し、 '@ Autowired'アノテーション(または' @ Inject'や '@Resource)を使ってビジネスクラスにそれらを挿入することができます。インポートする必要のあるxml構成がある場合は、Java構成として書き直すか、Java構成にインポートするだけです。次のリンクを参照してください。http://www.mkyong.com/spring/spring-mixing-xml- and-javaconfig/ –

答えて

0

、@Autowiredは、プロパティが正しく配線されていることを確認するために依存性チェックを実行します。 Springが接続するBeanを見つけられなかった場合、例外をスローします。これを修正するには、@Autowiredの "required"属性をfalseに設定して、このチェック機能を無効にすることができます。

@Autowired(=偽必須)

春は、一致するBeanを見つけることができない場合であっても、それが未設定の人の財産を残します。

関連する問題