您的位置:首页 > 移动开发 > WebAPP

问题记录:No WebApplicationContext found: no ContextLoaderListener registered

2016-11-25 00:00 555 查看
摘要: spring4.3.1

这个问题困扰了我不少时间。

正在我觉得用hibernate用的越来越得心应手的时候,但是发现出了一个bug,hibernate报no session,这个bug是我在用hibernate的时候不够严谨导致的,后来,我就用网上的方法OpenSessionInViewFilter去解决,不过并没有那么顺利,又出现了一个bug,no ContextLoaderListener registered 。

下面是我原来的web.xml。用的好好地,实际上我之前用mybatis时也是这样配置,junit测试也成功,所以,下面这段代码肯定是加载了spring框架的。

<web-app>
<display-name>whyville_backend</display-name>

<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

然后,我上网继续查找答案,发现了classloadlistener这个类,其实之前我也用过这种方式去加载servletcontext,但是因为要用mvc,所以还是得用dispatcherservlet。

我当时尝试性的用classloadlistener也加载了一遍,然后错误又回到了一开始,no session。其实我猜到了这个结果,因为OpenSessionInViewFilter的用途是让每一次请求只有一个session,这依赖注册在spring的sessionfactory,现在我用两种办法加载servletcontext,而且很明显,OpenSessionInViewFilter还是只能获取到classloadlistener加载的servletcontext里面的sessionfactory。

我查了一下资料,知道了classloadlistener和DispatcherServlet加载的内容存在不同的attribute里面(反正就是很里面,并不建议直接从那里获取servletcontext),然后我就决定,重写OpenSessionInViewFilter。因为一开始问题就是出现在他身上,他没办法获取dispatcherservlet里面的servletcontext(我尝试了很多办法,如果有更好的办法,希望可以分享一下)。

以下是我的解决办法。

@Service
public class ComponentKeeper {
public static SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
ComponentKeeper.sessionFactory = sessionFactory;
}
}

public class MyOpenSessionInViewFilter extends OpenSessionInViewFilter {

@Override
protected SessionFactory lookupSessionFactory(HttpServletRequest request) {
return ComponentKeeper.sessionFactory;
}
}

<web-app>
<display-name>whyville_backend</display-name>

<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
com.whyville.backend.util.springEnhanced.MyOpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐