-
Shiro+Struts2+Spring3 加上@RequiresPermissions 后@Autowired失效20
@ParentPackage("all")
@Namespace("/project")
public class ProjectAction extends BaseAction {
public final static Logger logger = LoggerFactory
.getLogger(ProjectAction.class);
@Autowired(required=true)
private ProjectService projectService;
private String code;
private Project project;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
@RequiresPermissions("SYS_PROJECT:FIND")
@Action(value = "findAll", results = { @Result(name = "success", type = "json", params = {
"ignoreHierarchy", "false", "root", "dataMap" }) })
public String findAll() {
Subject subject = SecurityUtils.getSubject();
if (subject.isPermitted("SYS_PROJECT:FIND")){
System.out.println("授权验证通过");
}
ProjectCriteria projectCriteria = new ProjectCriteria();
Criteria criteria = projectCriteria.createCriteria();
if (project == null) {
project = new Project();
}
if (project.getCode() != null
&& !"".equals(project.getCode().trim())) {
criteria.andCodeLike("%" + project.getCode() + "%");
}
if (project.getName() != null
&& !"".equals(project.getName().trim())) {
criteria.andNameLike("%" + project.getName() + "%");
}
int total = 0;
try
{
System.out.println(projectService==null);
total = projectService.countByCriteria(projectCriteria);
}catch(RuntimeException e){
System.out.println(e);
}
dataMap.put("total", total);
dataMap.put("rows", projectService.selectByCriteria(projectCriteria));
return SUCCESS;
}
@RequiresPermissions("SYS_PROJECT:ADD")
@Action(value = "add", results = { @Result(name = "success", type = "json", params = {
"ignoreHierarchy", "false", "root", "resultMap" }) })
public String add() {
try {
projectService.saveProject(project);
resultMap.put("success", "true");
resultMap.put("msg", "add success");
} catch (Exception e) {
resultMap.put("msg", "add error" + e.getStackTrace());
}
return SUCCESS;
}
@RequiresPermissions("SYS_PROJECT:UPD")
@Action(value = "toUpdate", results = { @Result(name = "success", type = "json", params = {
"includeProperties", "project.*" }) })
public String toUpdate() {
project = projectService.selectByPrimaryKey(this.getCode());
return SUCCESS;
}
@RequiresPermissions("SYS_PROJECT:UPD")
@Action(value = "update", results = { @Result(name = "success", type = "json", params = {
"ignoreHierarchy", "false", "root", "resultMap" }) })
public String update() {
try {
projectService.updateByPrimaryKey(project);
resultMap.put("success", "true");
resultMap.put("msg", "Update success");
} catch (Exception e) {
resultMap.put("msg", "Update error" + e.getMessage());
}
return SUCCESS;
}
@RequiresPermissions("SYS_PROJECT:DEL")
@Action(value = "delete", results = { @Result(name = "success", type = "json", params = {
"ignoreHierarchy", "false", "root", "resultMap" }) })
public String delete() {
try {
projectService.deleteByPrimaryKey(this.getCode());
resultMap.put("success", "true");
resultMap.put("msg", "Delete success");
} catch (Exception e) {
resultMap.put("msg", "Delete error" + e.getMessage());
}
return SUCCESS;
}
}
加上@RequiresPermissions注释后可以获取到授权信息,但是projectService无法注入。
【授权验证通过
true
java.lang.NullPointerException】
删除所有的@RequiresPermissions后正常。前台可以获取到数据。
shiro的配置也没有错,
<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
求解啊2013年4月19日 16:19
2个答案 按时间排序 按投票排序
-
采纳的答案
1、从如下看 你使用了struts2-convention 插件扫描action 如如下的filter
@ParentPackage("all")
@Namespace("/project")
public class ProjectAction extends BaseAction {
<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、因此与spring集成了 但
@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()); //此时走了 预处理和 后处理器 所以代理类bean
return autoWireBean(bean, autoWiringFactory); // 然后autowire 此时给了代理对象 问题就处在这 可以认为是个bug
}
} catch (UnsatisfiedDependencyException e) {
if (LOG.isErrorEnabled())
LOG.error("Error building bean", e);
// Fall back
return autoWireBean(super.buildBean(clazz, extraContext), autoWiringFactory);
}
}
解决方案
1、不使用actionPackages
而是 在类上加 @Controller @Scope 完全走spring
2、使用setter注入 而不是字段 如
private ProjectService projectService;
@Autowired(required=true)
public void setProjectService() {
}
3、修改bug
把autowire 放到预处理和后处理之前2013年4月19日 16:43
-
引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]引用引用引用引用引用引用引用引用引用[flash=200,200][img][list]
[*]引用
[/list][/img][/flash]2015年10月26日 14:18
相关推荐
"Shiro+Struts2+MyBatis+Spring"的整合就是这样的一个例子,它将四个各自具有特定功能的框架结合在一起,以实现更强大、灵活的Web应用程序。下面将详细解释这些框架以及它们在整合中的作用。 1. **Apache Shiro**:...
【标题】基于Shiro+Struts2+Hibernate+Spring+Sitemash框架集合的毕业设计管理系统是一种综合运用多种技术实现的企业级应用。这个系统利用这些框架的特性,构建了一个功能完善的管理平台,旨在提升开发效率,优化...
1,shiro+hibernate4+struts2+spring+easyui+fusioncharts部分bootstrap样式全注解零配置简单权限管理web项目 2,简单shiro权限管控 细度到按钮 3,安装方法按config.properties参数配置你的数据库 4,运行dbsql.sql 5,...
1、基于springboot+shiro+jwt+vue+redis的后台管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...
基于springboot微服务框架的个人博客系统,技术栈SpringCloud+MyBatis+Redis+shiro+vue 基于springboot微服务框架的个人博客系统,技术栈SpringCloud+MyBatis+Redis+shiro+vue 基于springboot微服务框架的个人博客...
基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统 基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统 基于 SpringBoot + Spring + ...
本项目"springboot+shiro+swagger2前后端分离整合"提供了一个实用的框架组合,旨在帮助开发者快速搭建这样的应用。以下是对这个项目及其组成部分的详细解析: 1. **Spring Boot**: Spring Boot是由Pivotal团队...
3. **会话存储**:Shiro将会话信息(包括用户ID、权限等)序列化,并通过Spring Data存入Redis。 4. **跨系统共享**:用户访问其他系统时,该系统查询Redis中是否存在对应的会话。如果存在,说明用户已登录,直接...
本项目"简单的权限管理搭建 shiro +hibernate4+struts2+spring+easyui+fusioncharts部分bootstrap样式"是基于一系列成熟的技术框架进行实现的。接下来,我们将深入探讨这些技术及其在权限管理中的应用。 1. **...
本后台管理系统,采用流行的框架springMvc+spring+mybatis+shiro+redis+ehcache开发,实现了权限管理(菜单权限、数据权限),solr全文搜索引擎,activiti工作流程引擎,cas单点登陆等功能,完善的代码生成器 后期还...
这个"springMVC+mybatis+shiro+redis 项目整合demo"就是一个实例,展示了如何将这些技术集成到一个项目中,以实现高效的数据处理、用户认证授权和缓存管理。 首先,`SpringMVC` 是 Spring 框架的一部分,它是一个...
在本项目中,当用户通过Shiro验证后,系统不再创建传统的Session,而是生成一个JWT。这个JWT包含了用户的标识和其他必要的权限信息,然后发送给客户端。客户端在后续的请求中携带这个JWT,服务端通过解码JWT来验证...
3. 配置Shiro:在Shiro的配置中,我们需要设置CasClient,让它与Pac4j协同工作,处理Ticket验证。同时,定义角色和权限规则。 4. 客户端配置:在每个需要SSO的服务应用中,也需要配置Pac4j,以识别和处理来自CAS的...
基于 springboot+mybatis_+shiro + redis+activiti+quarts+quartz+vue 写的一个前后分离办公企业管理系统 ,通用服务端,用于学习。 使用技术 服务端: springboot(2.2.1) + mybatis-push + shiro(1.4.0) + redis +...
Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理...
Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统。 Spring+SpringMVC+MyBatis+Shiro+MySQL+Redis+Maven+EasyUI+Bootstrap实现的通用权限管理系统 Spring+SpringMVC+...
"Shiro+SpringMVC+Redis+MySQL实现单点登录"是一个典型的系统安全架构,它整合了多个技术组件来构建一个高效、可靠的单点登录(Single Sign-On, SSO)解决方案。以下是关于这个主题的详细知识点: 1. **Apache ...
基于 SpringBoot + Mybatis Plus + Shiro + mysql + redis构建的智慧云智能教育平台。架构上使用完全前后端分离。 支持多种题型:选择题、多选题、判断题、填空题、综合题以及数学公式。支持在线考试,教师在线批改...
本系统(基于SpringBoot+MyBatis+Apache Shiro+Bootstrap+Thymeleaf) 可用于开发所有企业级WEB应用系统(如:各种后台管理系统、CRM、ERP、CMS、OA、博客、论坛等...)。响应式布局,支持大部分浏览器(如:IE9+...
项目描述 在上家公司自己集成的一套系统,用了两个多月的时间完成的:Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级开发系统 Springboot作为容器,使用mybatis作为持久层框架 使用官方推荐的thymeleaf做为...