一个简单的过滤器实现:
public class SessionFilter extends GenericFilterBean {
@Autowired
private SessionFactory sessionFactory;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("SessionFilter : doFilter called. Opening session...");
if(sessionFactory == null) {
System.out.println("Its null");
}
sessionFactory.getCurrentSession().beginTransaction();
System.out.println("SessionFilter : doFilter calling filter chain..");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("SessionFilter : doFilter closing session.");
sessionFactory.getCurrentSession().getTransaction().commit();
System.out.println("SessionFilter : doFilter finished.");
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory =sessionFactory;
}
}
web . xml:
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>lt.maze.controller.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
和我的应用程序上下文xml文件的一部分:
<beans:bean id="hibernate5AnnotatedSessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="SessionFilter" class="lt.maze.controller.SessionFilter">
<beans:property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" />
</beans:bean>
由于某种原因,变量sessionFactory总是null,我得到一个null点异常(并且print打印"its null")。完整的消息是16 aug . 2015 23:51:38.383 SEVERE [http-apr-8080- exec2] org.apache.catalina.core.StandardWrapperValve.invoke servlet .service() for servlet [maze] in context with path[]抛出异常java.lang.NullPointerException
EDIT:I add more prints to SessionFilter
s setSessionFactory
method:
public void setSessionFactory(SessionFactory sessionFactory) {
System.out.println("SesionFilter : setSessionFactory called");
if(sessionFactory == null) {
System.out.println("SessionFilter : setSessionFactory. sessionFactory is null");
} else {
System.out.println("SessionFilter : setSessionFactory. sessionFactory isnt null");
}
this.sessionFactory = sessionFactory;
System.out.println("After assignment this.sessionFactory null? " + (this.sessionFactory == null));
}
哪个打印出来
SesionFilter : setSessionFactory called
SessionFilter : setSessionFactory. sessionFactory isnt null
After assignment this.sessionFactory null? false
那么如果它的值没有改变,sessionFactory怎么可能是空的呢?
通过更改filter属性中的过滤器类来解决(我认为):
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
你必须让SessionFilter成为spring上下文的一部分。
@ componentSessionFilter扩展GenericFilterBean {
}
,而不是手动创建它的对象,通过使用
注入依赖@ autowired