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

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

正在我觉得用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>

 

转载于:https://my.oschina.net/u/3056071/blog/794508

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值