spring3.2+hibernate4.2 整合 spring security报No Session found for current thread

[code="java"]
public class SpringSecurityMetaDataSource implements FilterInvocationSecurityMetadataSource {
//@Resource(name = "resourceDao")
private ResourceDao resourceDao;

private static Map<String, Collection<ConfigAttribute>> resourceMap = null;

@Autowired
public SpringSecurityMetaDataSource(ResourceDao resourceDao) {
    this.resourceDao = resourceDao;
    loadResourceDefine();
}

}

/**
 * 加载所有资源与权限的关系
 */
@SuppressWarnings("unused")
private void loadResourceDefine() {  
    if(resourceMap == null) {  
        resourceMap = new HashMap<String, Collection<ConfigAttribute>>();  
        List<ResourceManager> resources = this.resourceDao.listAll(ResourceManager.class);
        for (ResourceManager resource : resources) {
            Collection<ConfigAttribute> configAttributes = new ArrayList<ConfigAttribute>();  
                            //以权限名封装为Spring的security Object  
            ConfigAttribute configAttribute = new SecurityConfig(resource.getName());  
            configAttributes.add(configAttribute);  
            resourceMap.put(resource.getUrl(), configAttributes);  
        }  
    }  

    Set<Entry<String, Collection<ConfigAttribute>>> resourceSet = resourceMap.entrySet();
    Iterator<Entry<String, Collection<ConfigAttribute>>> iterator = resourceSet.iterator();

}

[/code]

断点跟进去后发现:
List resources = this.resourceDao.listAll(ResourceManager.class);
是这抛出的错,报Caused by: org.hibernate.HibernateException: No Session found for current thread

我怀疑 通过构造方法注入的resourceDao不受hibernate的事务管理,
因此上诉代码改为了:

[code="java"]
@Resource(name = "resourceDao")
private ResourceDao resourceDao;

private static Map<String, Collection<ConfigAttribute>> resourceMap = null;

@Autowired
public SpringSecurityMetaDataSource() {
    loadResourceDefine();
}

[/code]

这样的话,又会报resourceDao为空指针错,
详见代码附件。
jar包如下:
antlr-2.7.7.jar
aopalliance-1.0.jar
aspectjrt.jar
aspectjweaver.jar
commons-fileupload-1.3.jar
commons-logging-1.1.2.jar
dom4j-1.6.1.jar
druid-0.2.12.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.2.0.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jta-1.1.jar
mysql-connector-java-5.1.21.jar
spring-aop-3.2.2.RELEASE.jar
spring-aspects-3.2.2.RELEASE.jar
spring-beans-3.2.2.RELEASE.jar
spring-context-3.2.2.RELEASE.jar
spring-core-3.2.2.RELEASE.jar
spring-expression-3.2.2.RELEASE.jar
spring-jdbc-3.2.2.RELEASE.jar
spring-orm-3.2.2.RELEASE.jar
spring-security-config-3.2.0.M1.jar
spring-security-core-3.2.0.M1.jar
spring-security-web-3.2.0.M1.jar
spring-tx-3.2.2.RELEASE.jar
spring-web-3.2.2.RELEASE.jar
spring-webmvc-3.2.2.RELEASE.jar

4个回答

这样的话,又会报resourceDao为空指针错, -------->


<!-- 鍙涓氬姟閫昏緫灞傚疄鏂戒簨鍔?-->


/aop:config

<aop:config expose-proxy="true" proxy-target-class="true" />

-------------改为--------->


<!-- 鍙涓氬姟閫昏緫灞傚疄鏂戒簨鍔?-->


/aop:config

试试

java_wxp
java_wxp 是or的问题。。。
6 年多之前 回复
java_wxp
java_wxp 终于可以运行了,通过仔细对比你发我的项目文件,把xml文件的 xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security-3.1.xsd"> 改为: xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security-3.1.xsd"> 然后就可以正常启动了。 这样可以启动后,我总觉的不是这个原因,这么可能是这样呢,然后把版本号加回去,也是可以正常启动tomcat的。 真不知道这什么问题了。。。
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian <aop:pointcut id="txPointcut" expression="execution(* com.xp.dao..*.*(..)) OR execution(* com.xp.common..*.*(..))" /> ----------------> <aop:pointcut id="txPointcut" expression="execution(* com.xp.dao..*.*(..)) or execution(* com.xp.common..*.*(..))" />
6 年多之前 回复
java_wxp
java_wxp 我的项目给你发邮件了
6 年多之前 回复
java_wxp
java_wxp 708848446@qq.com ,多谢了。
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 你的邮箱是多少 我把改好的发给你 就是我说的问题 我本机测试都没问题
6 年多之前 回复
java_wxp
java_wxp 还是不行啊, <beans:bean id="securityMetaDataSource" class="com.xp.security.SpringSecurityMetaDataSource"> <beans:constructor-arg name="resourcesDao" ref="resourcesDao"></beans:constructor-arg> </beans:bean> 这段我原来是注释掉的,本意是想一步一步把这个框架搭起来的,等报securityMetaDataSource为空指针针在放开注释的; SpringSecurityFilter类中没加setSecurityMetadataSource方法,本本意也是等报空指针的时候想用注解的方式实现的。 @Resource(name = "resourceDao") private ResourceDao resourceDao; 这种方式就报 resourceDao java.lang.NullPointerException @Autowired public SpringSecurityMetaDataSource(ResourceDao resourceDao) { this.resourceDao = resourceDao; loadResourceDefine(); } 这样就报 No Session found for current thread
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian @Resource(name = "resourceDao") private ResourceDao resourceDao; 或 @Autowired public SpringSecurityMetaDataSource(ResourceDao resourceDao) { this.resourceDao = resourceDao; loadResourceDefine(); } 都没问题 <beans:bean id="securityMetaDataSource" class="com.xp.security.SpringSecurityMetaDataSource"> <beans:constructor-arg name="resourcesDao" ref="resourcesDao"></beans:constructor-arg> </beans:bean> resourcesDao写错了 而且删除即可 因为你在构造器上@Autowired了 <!-- 配置过滤器 --> <beans:bean id="springSecurityFilter" class="com.xp.security.SpringSecurityFilter"> <!-- 用户拥有的权限 --> <beans:property name="authenticationManager" ref="securityAuthenticationManager" /> <!-- 用户是否拥有所请求资源的权限 --> <beans:property name="accessDecisionManager" ref="securityAccessDecisionManager" /> <!-- 资源与权限对应关系 --> <beans:property name="securityMetadataSource" ref="securityMetaDataSource" /> </beans:bean> com.xp.security.SpringSecurityFilter 没有 public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource securityMetaDataSource) { this.securityMetaDataSource = securityMetaDataSource; }
6 年多之前 回复
java_wxp
java_wxp System.out.println("======"+resourceDao); //com.xp.dao.admin.ResourceDao@966110 System.out.println(AopUtils.isAopProxy(resourceDao)); //false System.out.println(AopUtils.isCglibProxy(resourceDao)); //false System.out.println(AopUtils.isJdkDynamicProxy(resourceDao)); //false resourceDao不是代理,但是没集成spring security前,事务是有效的。 还有resourceDao怎么给它设置个代理呢?
6 年多之前 回复
java_wxp
java_wxp 嗯,我仔细看看
6 年多之前 回复
jinnianshilongnian
jinnianshilongnian 没影响 你按照 http://jinnianshilongnian.iteye.com/blog/1850432 看看dao是代理吗
6 年多之前 回复
java_wxp
java_wxp 我是参考的这篇帖子配置的,http://blog.csdn.net/k10509806/article/details/6369131原来是用构造方法进行注入的。
6 年多之前 回复
java_wxp
java_wxp 不管用,不知道spring里用注解方用构造方法进行注入的方式是不是有什么特别需要注意的地方?还有 <tx:method name="list*" propagation="REQUIRED" read-only="true" />,这句对里的read-only属性应该不会对事务的传播性有影响吧?
6 年多之前 回复

我也遇到这样的错误,请教你,你解决了没

我是用SpringSecurityMetaDataSource 继承DAO类来获取session

我查了好久,应该是hibernate4的session没有在loadresource的方法open,我的解决办法是直接注入sessionfactory到这个类中,然后在调用resourceDao之前,opensession

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问