Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring和ServletContextListener_Spring_Spring Mvc_Servlets - Fatal编程技术网

Spring和ServletContextListener

Spring和ServletContextListener,spring,spring-mvc,servlets,Spring,Spring Mvc,Servlets,我在这里读了一些关于 @Autowired ServletContext context; 我的ServletContextListener到@Controller的实现。但我在运行它时遇到了一个很长的异常: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'trendsoftCtrl': Unsatisfied dependency expresse

我在这里读了一些关于

@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;
}

}
@控制器
公共类TrendsoftCtrl{
@自动连线
ServletContext;
@请求映射(“/welcome”)
公共模型和视图helloWorld(){
NewsDao NewsDao=(NewsDao)context.getAttribute(“dao”);
List news=newsDao.getAll();
StringBuilder消息=新建StringBuilder();
为(新闻n:新闻){
message.append(n.getCategory().getName()+“
”; message.append(n.getName()+“
”); message.append(n.getData()+“

”; } 返回新模型和视图(“欢迎”,“新闻”,message.toString()); } 公共ServletContext getContext(){ 返回上下文; } 公共void setContext(ServletContext){ this.context=上下文; } }
默认情况下,@Autowired将执行依赖项检查,以确保属性已正确连接。当Spring找不到匹配的bean进行连接时,它将抛出一个异常。要修复此问题,可以通过将@Autowired的“required”属性设置为false来禁用此检查功能

@自动连线(必需=错误)


即使Spring找不到匹配的bean,它也会使person属性未设置。

默认情况下,@Autowired将执行依赖项检查,以确保属性已正确连接。当Spring找不到匹配的bean进行连接时,它将抛出一个异常。要修复此问题,可以通过将@Autowired的“required”属性设置为false来禁用此检查功能

@自动连线(必需=错误)


即使Spring找不到匹配的bean,它也会使person属性未设置。

为什么要将
ServletContext
注入控制器?它打破了弹簧设计的松耦合概念。您应该将DAO类声明为独立bean,并正确配置根上下文和servlet上下文。尝试使用SpringJava配置,以此链接为例:您不需要将任何bean放入
ServletContext
manuallyOk。但是我看不到关于侦听器的任何信息,为什么要使用自定义侦听器?看起来您刚刚在侦听器的上下文中添加了一些bean。您可以完全避免与上下文交互,只需使用Spring。您可以以声明方式配置这些bean,并使用
@Autowired
注释(或
@inject
或``@Resource)将它们注入到您的业务类中。如果您有需要导入的xml配置,您可以将其重写为Java配置,或者只导入Java配置,请参阅以下链接:仅一个问题。。。为什么?Spring已经有了
ContextLoaderListener
,它将加载您的配置。其次,通过上下文传递bean是一个坏主意,因为这基本上超过了依赖注入的全部目的?它打破了弹簧设计的松耦合概念。您应该将DAO类声明为独立bean,并正确配置根上下文和servlet上下文。尝试使用SpringJava配置,以此链接为例:您不需要将任何bean放入
ServletContext
manuallyOk。但是我看不到关于侦听器的任何信息,为什么要使用自定义侦听器?看起来您刚刚在侦听器的上下文中添加了一些bean。您可以完全避免与上下文交互,只需使用Spring。您可以以声明方式配置这些bean,并使用
@Autowired
注释(或
@inject
或``@Resource)将它们注入到您的业务类中。如果您有需要导入的xml配置,您可以将其重写为Java配置,或者只导入Java配置,请参阅以下链接:仅一个问题。。。为什么?Spring已经有了
ContextLoaderListener
,它将加载您的配置。其次,通过上下文传递bean是一个坏主意,因为这基本上超过了依赖注入的全部目的。