Я читал некоторые статьи и сообщения здесь оSpring и контекст сервлет
@Autowired
ServletContext context;
из моей реализации ServletContextListener
в @Controller
. Но я получил длительное исключение, когда его запускали:
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 как автономный компонент и правильно настроить контекст корня и контекст сервлета. Попробуйте использовать конфигурацию Spring Java, см. Эту ссылку в качестве примера: http://www.mkyong.com/spring-mvc/gradle-spring-4-mvc-hello-world-example-annotation/ Вам не нужно поместите любые бобы в 'ServletContext'manually –
Хорошо. Но я ничего не вижу о слушателях – R1K0
Почему вы используете пользовательский прослушиватель? Похоже, вы просто положили несколько компонентов в контекст вашего слушателя. Вы можете вообще не взаимодействовать с контекстом, просто используйте Spring. Вы можете настроить эти компоненты декларативным образом и ввести их в свои бизнес-классы с помощью аннотации @ @ Autowired (или '@ Inject' или' @Resource). Если у вас есть xml-конфигурация, которую вам нужно импортировать, вы можете переписать ее как конфигурацию Java или просто импортировать в конфигурацию Java, см. Эту ссылку: http://www.mkyong.com/spring/spring-mixing-xml- and-javaconfig/ –