2016-06-25 3 views
0

Я читал некоторые статьи и сообщения здесь о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; 
} 

} 
+0

Почему вы вводите 'ServletContext' в свой контроллер? Это ломает идею свободной связи, для которой Spring был дизайнером. Вы должны объявить свой класс DAO как автономный компонент и правильно настроить контекст корня и контекст сервлета. Попробуйте использовать конфигурацию Spring Java, см. Эту ссылку в качестве примера: http://www.mkyong.com/spring-mvc/gradle-spring-4-mvc-hello-world-example-annotation/ Вам не нужно поместите любые бобы в 'ServletContext'manually –

+0

Хорошо. Но я ничего не вижу о слушателях – R1K0

+0

Почему вы используете пользовательский прослушиватель? Похоже, вы просто положили несколько компонентов в контекст вашего слушателя. Вы можете вообще не взаимодействовать с контекстом, просто используйте Spring. Вы можете настроить эти компоненты декларативным образом и ввести их в свои бизнес-классы с помощью аннотации @ @ Autowired (или '@ Inject' или' @Resource). Если у вас есть xml-конфигурация, которую вам нужно импортировать, вы можете переписать ее как конфигурацию Java или просто импортировать в конфигурацию Java, см. Эту ссылку: http://www.mkyong.com/spring/spring-mixing-xml- and-javaconfig/ –

ответ

0

По умолчанию @Autowired будет выполнять проверку зависимостей, чтобы убедиться, что имущество было правильно подключен. Когда Spring не может найти подходящий компонент для проводки, он выдает исключение. Чтобы исправить это, вы можете отключить эту функцию проверки, установив «обязательный» атрибут @Autowired на false.

@Autowired (требуется = ложь)

Даже если весна не может найти соответствующий компонент, он оставит свойство человека неустановленным.