风雨无阻

(转)Struts Spring Hibernate 整合报空指针解决方法

最近一直在弄WebWork,Struts都快忘了。今天又自己小试了一下SSH,结果每次都是报空指针异常,经过一番研究,发现,如果不把action的type改成

org.springframework.web.struts.DelegatingActionProxy

的话,就会报这个

java.lang.NullPointerException

 com.test.struts.action.UserAction.show(UserAction.java:46)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
解决办法:
1.在struts-config.xml的action把type改成org.springframework.web.struts.DelegatingActionProxy,例如:
<action attribute="userForm" input="/index.jsp" name="userForm"
          parameter="param" path="/user" scope="request"
          type="org.springframework.web.struts.DelegatingActionProxy"
          validate="false">
          <forward name="success" path="/success.jsp" />
</action>
2.在spring的配置文件(applicationContext.xml)里添加一些代码:
<bean id="transactionManager"
         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
         <property name="sessionFactory">
          <ref bean="sessionFactory" />
         </property>
</bean>
给DAO加上代理
<bean id="UserDAOIProxy"
         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
         <property name="transactionManager">
          <ref bean="transactionManager" />
         </property>
         <property name="target">
          <ref bean="UserDao" />
         </property>
         <property name="transactionAttributes">
          <props>
           <prop key="create*">PROPAGATION_REQUIRED</prop>
           <prop key="update*">PROPAGATION_REQUIRED</prop>
           <prop key="delete*">PROPAGATION_REQUIRED</prop>
           <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
          </props>
         </property>
</bean>
3.更改Service的引用
 <bean name="UserService"
         class="com.test.service.impl.UserServiceImpl">
         <property name="userDao">
          <ref bean="
UserDAOIProxy" />
         </property>
</bean>
这样就不会报那个异常了,测试通过^_^
我的配置文件代码:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
         class="org.apache.commons.dbcp.BasicDataSource">
         <property name="driverClassName"
          value="oracle.jdbc.driver.OracleDriver">
         </property>
         <property name="url"
          value="jdbc:oracle:thin:@192.192.192.19:1521:orcl">
         </property>
         <property name="username" value="sunyu"></property>
         <property name="password" value="19830317"></property>
</bean>
<bean id="sessionFactory"
         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
         <property name="dataSource">
          <ref bean="dataSource" />
         </property>
         <property name="hibernateProperties">
          <props>
           <prop key="hibernate.dialect">
            org.hibernate.dialect.Oracle9Dialect
           </prop>
           <prop key="hibernate.show_sql">true</prop>
          </props>
         </property>
         <property name="mappingResources">
          <list>
           <value>com/test/model/TestUser.hbm.xml</value>
          </list>
         </property>
</bean>
<bean id="transactionManager"
         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
         <property name="sessionFactory">
          <ref bean="sessionFactory" />
         </property>
</bean>
<bean name="UserDao" class="com.test.dao.impl.UserDaoImpl">
         <property name="sessionFactory">
          <ref bean="sessionFactory" />
         </property>
</bean>
<bean id="UserDAOIProxy"
         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
         <property name="transactionManager">
          <ref bean="transactionManager" />
         </property>
         <property name="target">
          <ref bean="UserDao" />
         </property>
         <property name="transactionAttributes">
          <props>
           <prop key="create*">PROPAGATION_REQUIRED</prop>
           <prop key="update*">PROPAGATION_REQUIRED</prop>
           <prop key="delete*">PROPAGATION_REQUIRED</prop>
           <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
          </props>
         </property>
</bean>
<bean name="UserService"
         class="com.test.service.impl.UserServiceImpl">
         <property name="userDao">
          <ref bean="UserDAOIProxy" />
         </property>
</bean>
<bean name="/user" class="com.test.struts.action.UserAction">
         <property name="userService">
          <ref bean="UserService" />
         </property>
</bean>
</beans>
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "
http://struts.apache.org/dtds/struts-config_1_2.dtd
">
<struts-config>
<data-sources />
<form-beans>
         <form-bean name="userForm" type="com.test.struts.form.UserForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
         <action attribute="userForm" input="/index.jsp" name="userForm"
          parameter="param" path="/user" scope="request"
          type="org.springframework.web.struts.DelegatingActionProxy"
          validate="false">
          <forward name="success" path="/success.jsp" />
         </action>
</action-mappings>
<message-resources parameter="com.test.struts.ApplicationResources" />
<plug-in
         className="org.springframework.web.struts.ContextLoaderPlugIn">
         <set-property property="contextConfigLocation"
          value="/WEB-INF/applicationContext.xml" />
</plug-in>

</struts-config>



------------------------------------------
第二种方法,如果在struts-config.xml里面加上

<controller>
<set-property property="processorClass"
value="org.springframework.web.struts.DelegatingRequestProcessor" />
</controller>

这样action就不需要type属性了
----------------------------------------------

posted on 2008-04-03 19:14 秋枫故事 阅读(2442) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

新闻档案

搜索

最新评论

阅读排行榜

评论排行榜