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;
}
}
なぜあなたはあなたのコントローラに 'ServletContext'を注入しますか?これは、Springが設計していたルーズカップリングのアイデアを破るものです。 DAOクラスをスタンドアロンBeanとして宣言し、ルートコンテキストとサーブレットコンテキストを適切に設定する必要があります。 Spring Javaの設定を使用してみてください(このリンクを例として参照してください):http://www.mkyong.com/spring-mvc/gradle-spring-4-mvc-hello-world-example-annotation/任意のbeanを 'ServletContext'に手動で入れてください –
Ok。しかし、私はそこにリスナーについて何も表示されません – R1K0
なぜカスタムリスナーを使用していますか?あなたのリスナーのコンテキストにいくつかの豆を置くように見えます。コンテキストとのやりとりを避けることができます。ちょうどSpringを使用してください。これらのBeanを宣言的に構成し、 '@ Autowired'アノテーション(または' @ Inject'や '@Resource)を使ってビジネスクラスにそれらを挿入することができます。インポートする必要のあるxml構成がある場合は、Java構成として書き直すか、Java構成にインポートするだけです。次のリンクを参照してください。http://www.mkyong.com/spring/spring-mixing-xml- and-javaconfig/ –