Spring GenericFilterBean @AutoWired hibernate属性为空



一个简单的过滤器实现:

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

最新更新