会话范围的CDI托管bean在Spring集成后的行为类似于应用程序范围的bean

会话范围的CDI托管bean在Spring集成后的行为类似于应用程序范围的bean,spring,spring-security,cdi,managed-bean,Spring,Spring Security,Cdi,Managed Bean,我们希望通过集成SpringCDI+JSF+SpringSecurity来创建web应用程序。我们已经配置了上面所有的框架,我们认为一切正常,但是在实现注销功能的过程中,我们意识到JSF的ManagedBeans并不是在应该创建的时候创建的。例如:我们已经在会话作用域中创建了托管bean,我们希望在注销并使会话无效后删除该bean 不幸的是,重新登录后,托管bean实例仍然处于活动状态(每个用户信息都与注销前相同:()。我们添加了更多日志,并且注意到托管bean是在启动应用程序期间创建的,而不是

我们希望通过集成SpringCDI+JSF+SpringSecurity来创建web应用程序。我们已经配置了上面所有的框架,我们认为一切正常,但是在实现注销功能的过程中,我们意识到JSF的ManagedBeans并不是在应该创建的时候创建的。例如:我们已经在会话作用域中创建了托管bean,我们希望在注销并使会话无效后删除该bean

不幸的是,重新登录后,托管bean实例仍然处于活动状态(每个用户信息都与注销前相同:()。我们添加了更多日志,并且注意到托管bean是在启动应用程序期间创建的,而不是在初始化用户会话期间创建的。我们发现这是由上下文引起的:component scan base package=“…”在spring应用程序上下文配置文件中,我们添加了上下文:exclude filter type=“”expression=“”,但在此之后,将不再创建任何托管bean:(。我们在下面添加了一些列表

applicationContext.xml

<context:property-placeholder location="classpath:application.properties"/>

<context:component-scan base-package="com.teaman" />
<mongo:repositories base-package="com.teaman.dao" />

<mongo:mongo host="${mongodb.hostname}" port="${mongodb.port}" id="mongo" />
<mongo:db-factory id="mongoDbFactory" mongo-ref="mongo" dbname="${mongodb.dbname}" />
<mongo:mapping-converter id="converter" db-factory-ref="mongoDbFactory" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    <constructor-arg name="mongoConverter" ref="converter"/>
    <property name="writeConcern">
        <util:constant static-field="com.mongodb.WriteConcern.SAFE" ></util:constant>
    </property>
</bean>

<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean id="gridTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
    <constructor-arg ref="mongoDbFactory" />
    <constructor-arg ref="converter" />
</bean>

<bean id="teaManAuthenticationSuccessHandler" class="com.teaman.authentication.handler.TeaManAuthenticationSuccessHandler"/>
也许有人已经遇到了同样的问题,可以帮助我们吗?:)
非常感谢您提供的每一个提示/说明/评论。

我建议您使用Spring库中的@Scope(“会话”)而不是CDI中的@SessionScope。您似乎与默认的Spring作用域(即应用程序作用域)有冲突,所以它不起作用。

什么是Spring CDI?-我知道Spring(DI),和CDI,但没有Spring CDI应该是Spring+CDI+JSF…我的错误,对不起。使用Spring和CDI有什么好的理由吗?-如果没有,我强烈建议只使用其中一种(如果你想使用Spring安全性,我也会选择Spring)。那么JSF托管bean呢?我读到如果我们想将JSF与Spring一起使用,我们应该使用CDI(@Named等)。清除jsf托管bean在spring层无法正常工作。spring的默认作用域是应用程序作用域。因此,我猜bean管理配置出了问题,您的支持bean实际上被视为spring托管bean,而不是CDI托管bean。相关:
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
 </beans>
<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>

    <locale-config>
        <default-locale>pl</default-locale>
    </locale-config>

    <resource-bundle>
        <base-name>com.teaman.locales.locale</base-name>
        <var>msg</var>
    </resource-bundle>
</application> 

<application>
    <message-bundle>com.teaman.ValidationMessages</message-bundle>
</application>

<lifecycle>
    <phase-listener>com.teaman.bean.LoginErrorPhaseListener</phase-listener>
</lifecycle>
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml
        /WEB-INF/securityContext.xml
    </param-value>
</context-param>

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

<!-- Context listener responsible for loading spring applicationContext file -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
    <url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>
package com.teaman.bean;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.inject.Named;
import org.apache.log4j.Logger;

@Named(value = "teaManUserSessionBean")
@SessionScoped
public class TeaManUserSessionBean implements Serializable {

     ....
     public void initUserSession(ComponentSystemEvent e) {
           logger.debug("TeaManUserSession init...");
     }
     ....
}