文档章节

Shiro+Struts2+Spring3 加上@RequiresPermissions 后@Autowired失效

j
 jway
发布于 2015/05/21 16:08
字数 491
阅读 10
收藏 0

今天一iteye网页在问答频道提问【Shiro+Struts2+Spring3 加上@RequiresPermissions 后@Autowired失效】,记录一下。

 

问题:

 

@ParentPackage("all") 
@Namespace("/project") 
public class ProjectAction extends BaseAction { 
public final static Logger logger = LoggerFactory 
.getLogger(ProjectAction.class); 

@Autowired(required=true) 
private ProjectService projectService;

 如上代码@Autowired注入不了

 

 

分析:

1、首先从如上代码可以看出 走的是struts2注解,而且使用了struts2 convention 插件,这个插件会扫描如下配置的actionPackages 寻找action

 

<filter> 
        <filter-name>struts2</filter-name> 
        <filter-classfilter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> 
        <init-param> 
<param-name>actionPackages</param-name> 
<param-value>cn.javass</param-value> 
</init-param>

 

 

2、但此时并没有把action交给spring,

3、接下来,因为集成了spring(有struts2-spring-plugin),所以要使用StrutsSpringObjectFactory创建bean,代码分析

 

@Override 
    public Object buildBean(String beanName, Map<String, Object> extraContext, boolean injectInternal) throws Exception { 
        Object o; 
        
        if (appContext.containsBean(beanName)) { 
            o = appContext.getBean(beanName); //拿不到bean 
        } else { 
            Class beanClazz = getClassInstance(beanName); 
            o = buildBean(beanClazz, extraContext); //所以创建了一个 
        } 
        if (injectInternal) { 
            injectInternalBeans(o); 
        } 
        return o; 
    }

 

/** 
     * @param clazz 
     * @param extraContext 
     * @throws Exception 
     */ 
    @Override 
    public Object buildBean(Class clazz, Map<String, Object> extraContext) throws Exception { 
        Object bean; 

        try { 
            // Decide to follow autowire strategy or use the legacy approach which mixes injection strategies 
            if (alwaysRespectAutowireStrategy) {//默认false 
                // Leave the creation up to Spring 
                bean = autoWiringFactory.createBean(clazz, autowireStrategy, false); 
                injectApplicationContext(bean); 
                return injectInternalBeans(bean); 
            } else { 
                bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false); //只走构造器注入 
                bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName()); 
                // We don't need to call the init-method since one won't be registered. 
                bean = autoWiringFactory.applyBeanPostProcessorsAfterInitialization(bean, bean.getClass().getName()); 
                return autoWireBean(bean, autoWiringFactory); 
            } 
        } catch (UnsatisfiedDependencyException e) { 
            if (LOG.isErrorEnabled()) 
                LOG.error("Error building bean", e); 
            // Fall back 
            return autoWireBean(super.buildBean(clazz, extraContext), autoWiringFactory); 
        } 
    }

 

 我们在shiro里使用如下代码 去代理shiro的代理:

 

<bean id="proxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor">
        <property name="proxyTargetClass" value="true"/>
    </bean>

    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

 

 

//StrutsSpringObjectFactory的如下代码将执行处理器的预处理

bean = autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean, bean.getClass().getName());

 

//DefaultAdvisorAutoProxyCreator的postProcessBeforeInstantiation:将去完成代理bean 因此此时将返回代理Bean

 

//接着StrutsSpringObjectFactory的autoWireBean(bean, autoWiringFactory); 进行注入 所以此时注入到的是代理对象,因此如果字段注入 将注入不了。

 

 

解决方案

 

1、不使用actionPackages   而是 在类上加  @Controller @Scope 完全走spring  

2、使用setter注入 而不是字段 如 

  private ProjectService projectService; 

 

  @Autowired(required=true) 

  public void setProjectService() { 

  } 

 

 

本文转载自:http://jinnianshilongnian.iteye.com/blog/1850425

j
粉丝 4
博文 55
码字总数 0
作品 0
长沙
私信 提问
《跟我学Shiro》系列教程PDF完结版下载

Shiro目录 第一章 Shiro简介 第二章 身份验证 第三章 授权 第四章 INI配置 第五章 编码/加密 第六章 Realm及相关对象 第七章 与Web集成 第八章 拦截器机制 第九章 JSP标签 第十章 会话管理 ...

HenrySun
2016/10/09
141
0
shiro 权限的怪癖想法

@江南白衣 你好,想跟你请教个问题: 看到你的springside里面的shiro权限应用,我结合我自己的想法,碰到了如下的门槛: 列举一个你以前的mini-web中的权限例子如下: 1。针对USER模块的 保存...

os_yun70345
2012/10/12
4.3K
2
Springboot 整合 shiro

第一步、引入 pom <!--springboot 整合 shiro --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.3.2</version></dependency> 第二步、定......

嘴角轻扬30
02/15
0
0
RequiresPermissions注解的value 值一定是键值对的形式吗?

@RequiresPermissions ({"index:hello","index:world" })这个注解一定是要键值对的形式吗?能不能用@RequiresPermissions ({"hello","world" })这种形式的?......

sprouting
2018/06/19
557
2
shiro动态配置权限

我想实现论坛中版主的权限,即不同的版主只享有其相对应的板块的权限 如果有如下板块 板块1 板块2 板块3 ,其对应的版主分别是 版主1 版主2 版主3,每个板块都有若干帖子 我给 版主1 分配 板...

z596593851
2017/04/29
398
2

没有更多内容

加载失败,请刷新页面

加载更多

Dell R740服务器设置磁盘直通,不做RAID虚拟磁盘阵列

实验环境 1.不做RAID 2.磁盘直通 3.安装win2016 切换non-RAID模式 F2进入Device Settings后选择第一行的PERC H730,之后点击Physical Disk Mangement 然后查看硬盘的状态,是否均为rea...

Linux就该这么学
36分钟前
3
0
如何将现有的外部代码库导入到猪齿鱼中

本篇将为大家介绍如何将应用导入到Choerodon猪齿鱼。Choerodon平台上导入应用有两个入口,第一个入口在应用管理页签内,是从gitlab/github导入应用,第二个入口在应用市场中,可以在其它平台...

Choerodon
39分钟前
3
0
debezium关于cdc的使用(上)

博文原址:debezium关于cdc的使用(上) 简介 debezium是一个为了捕获数据变更(cdc)的开源的分布式平台。启动并指向数据库,当其他应用对此数据库执行inserts、updates、delete操作时,此应用快...

大萌小路
40分钟前
1
0
可怕的贝叶斯定理,看完后忍不住感慨数学太重要了

学多点知识   你好我也好   广州又在下大暴雨了,超模君还是一如既往待在工作室码着字!      (看图猜地方,猜对了,送你一个糖)   即便天气不好,也不能冷落我的模友们,那今天...

wmzsonic
44分钟前
7
0
SpringBoot系列文章简介

  SpringBoot系列文章简介      SpringBoot源码阅读辅助篇:      Spring IoC容器与应用上下文的设计与实现      SpringBoot启动流程源码分析:      SpringBoot启动流程分...

SEOwhywhy
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部