Struts2的action无法实例化

Areaze 2016-06-19 04:20:24
兄弟们请教一个问题 ,JDK1.7 Myelipse Tomcat 7 spring3.24,跟的是一个SSH的OA项目, struts2的一个action文件之前还跑得好好的 ,跳转都无问题, 现在排查出来了是这一句代码突然报空指针错误, 而且导致struts2的action跳转都失效了,用的是spring注解,spring接管struts2。前几天还用的好好的 突然就出现这个情况了 而且莫名其妙不知道问题出现在哪,代码和教程完全一致,求各位指点!

其中下面这段RoleAction代码的第二行代码roleList = roleService.findAll();有空指针错误
public String list() throws Exception{

List<Role> roleList = new ArrayList<Role>();
roleList = roleService.findAll();
ActionContext.getContext().put("roleList", roleList); //放入值栈
return "list";
}


完整代码如下,roleService通过spring注解注入注入

package cn.itcast.oa.view.action;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import cn.itcast.oa.domain.Role;
import cn.itcast.oa.service.RoleService;
import cn.itcast.oa.service.impl.RoleServiceImpl;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;



@Controller("roleAction")
@Scope("prototype")
public class RoleAction extends ActionSupport implements ModelDriven<Role> {

@Resource
RoleService roleService;
//把前台的各种属性通过实现ModelDriven接口封装在Role类中 通过实现getModel方法返回即可 前台直接写属性名
private Role model = new Role();

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

private Long id;
private String name;
private String description;


//列表
public String list() throws Exception{

List<Role> roleList = new ArrayList<Role>();
roleList = roleService.findAll();
ActionContext.getContext().put("roleList", roleList); //放入值栈
return "list";
}

public RoleService getRoleService() {
return roleService;
}

public void setRoleService(RoleService roleService) {
this.roleService = roleService;
}

//删除
public String delete() throws Exception{
roleService.delete(id);
return "toList";
}

//添加页面
public String addUI() throws Exception{

return "addUI";

}

public String add() throws Exception{
//封装到对象中
Role role = new Role();
role.setName(name);
role.setDescription(description);
//保存到数据库
roleService.save(role);
return "toList";

}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String editUI() throws Exception{
Role role = roleService.getById(id);
ActionContext.getContext().getValueStack().push(role);// 可以放入值栈或者用下面的方法


return "editUI";
}

public String edit() throws Exception{
Role role = roleService.getById(id);
role.setName(name);
role.setDescription(description);
roleService.update(role);
return "toList";
}



public String test() throws Exception{

return "test";
}

@Override
public Role getModel() {

return model;
}
}


struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!--
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<include file="example.xml"/>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
-->


<!-- 开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 配置扩展名为action -->
<constant name="struts.action.extension=action" value="true" />
<!-- 主题配置为simple -->
<constant name="struts.ui.theme=xhtml" value="simple"/>

<package name="default" namespace="/" extends="struts-default">

<!-- 配置测试用的Action,未与Spring整合,class属性写类的全名 -->
<!-- 当Struts2与Spring整合后,class属性可以写bean的名称 -->
<!-- <action name="test" class="testAction">
<result name="success">/test.jsp</result>
</action> -->

<!-- 岗位管理 -->
<action name="role_*" class="cn.itcast.oa.view.action.RoleAction" method="{1}">
<result name="list">/WEB-INF/jsp/roleAction/list.jsp</result>
<result name="addUI">/WEB-INF/jsp/roleAction/addUI.jsp</result>
<result name="editUI">/WEB-INF/jsp/roleAction/editUI.jsp</result>
<result name="toList" type="redirectAction">role_list</result>
<result name="test">/test.jsp</result>
</action>


</package>


</struts>


applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">



<!-- 自动扫描web包 ,将带有注解的类 纳入spring容器管理 -->
<context:component-scan base-package="cn.itcast.oa"></context:component-scan>
<context:annotation-config />
<!-- 导入外部的properties文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- <bean id="roleAction" class="cn.itcast.oa.test" scope="prototype" /> -->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 指定hibernate的配置文件位置 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
<!-- 配置c3p0数据库连接池 -->
<property name="dataSource">
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 数据连接信息 -->
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<!-- 其他配置 -->
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="3"></property>
<!--连接池中保留的最小连接数。Default: 3 -->
<property name="minPoolSize" value="3"></property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="5"></property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="3"></property>
<!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->
<property name="maxStatements" value="8"></property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection" value="5"></property>
<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="1800"></property>
</bean>
</property>
</bean>


<!-- 配置声明式事务管理(采用注解的方式) -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>



</beans>


异常

Struts Problem Report

Struts has detected an unhandled exception:

Messages:
File: cn/itcast/oa/view/action/RoleAction.java
Line number: 47
Stacktraces

java.lang.NullPointerException
cn.itcast.oa.view.action.RoleAction.list(RoleAction.java:47)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)

...全文
273 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Areaze 2016-07-03
  • 打赏
  • 举报
回复
问题在applicationContent.xml文件在web.xml的路径设置成classpath不对 设置成classpath*就能用了 奇怪了
xiaohuashenshou 2016-06-21
  • 打赏
  • 举报
回复
引用 2 楼 scmod 的回复:
我直接的配置里好像要个<constant name="struts.objectFactory" value="spring" />
查看下struts-default.xml中这个配置是不是已经默认设置为spring,你这个问题不是struts的action没有实例化,而是action没有交给spring管理,所以你无法注入
scmod 2016-06-20
  • 打赏
  • 举报
回复
我直接的配置里好像要个<constant name="struts.objectFactory" value="spring" />
Areaze 2016-06-19
  • 打赏
  • 举报
回复
阵势找不到方法了 求各位帮下 谢谢!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧