SSI框架研究了N久后,开始试着搭建简单的小功能,经历的什么找不到,那个不可以,这个定义不正确等等让人崩溃的异常后,终于是有个页面出来了,但我一点,你妹的有给了我个空指针异常!!!折腾近两天了,发现该异常是由于spring依赖注入没有成功导致的,但看配置文件看了几百遍都没有看出错在哪里……
现贴出配置文件如下:
web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 配置Spring -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
    <param-value>
   classpath:/applicationContext.xml
  </param-value>
 </context-param>
 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>
 
    <display-name>Struts Blank</display-name>    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list></web-app>
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.objectTypeDeterminer" value="notiger" />      
     <constant name="struts.objectFactory" value="spring" />   
     <constant name="struts.objectFactory.spring.autoWire" value="name" />  
     
<package name="test" namespace="/test" extends="struts-default">

<action name="select" class="test.User">
<result>/test/result.jsp</result>
</action>
<!--
<action name="insert" class="test.userDAO">
<result>/test/result.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: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-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
  <property name="url"
   value="jdbc:oracle:thin:@localhost:1521:orcl" />
  <property name="username" value="system" />
  <property name="password" value="+1101+" />
 </bean>

 <!-- spring的ibatis 配制 -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:/sqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>

<!-- spring 的事务处理类配置 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>

<!-- 实体DAO类  -->
<bean id="userDAO" class="test.UserDAO">
<property name="sqlMapClient">
<ref local="sqlMapClient" />
</property>
</bean>


<!-- Struts2 action类 -->
<bean id="user" class="test.User" >
<property name="userdao">
<ref bean="userDAOProxy"/>
</property>
</bean>


<bean id="name" class="test.User">
<property name="name" value="张大三"/>
</bean>

<!-- 实体DAO类的代理类 -->
<bean id="userDAOProxy"  
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="select*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
</beans>
sqlMapConfig.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">
    
<sqlMap namespace="test">
<resultMap id="User-result-list"
class="test.User"> <result property="id" column="ID" /> <result property="name" column="name" /> <result property="sex" column="sex" /> </resultMap>
<select id="selectUser" resultMap="User-result-list">
select id,name,sex from test
</select></sqlMap>
User.java
package test;import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.annotation.Resource;
@Resource(name="user")
public class User  extends ActionSupport  {
private String id;
private String name;
private String sex;
@Resource
private IuserDAO userdao;

private List userList;

//省略各种setter,getter方法……
public void setUserdao(IuserDAO userdao) {
this.userdao = userdao;
}

public String execute() throws Exception 
{
HttpServletRequest request = ServletActionContext.getRequest(); 
userList = userdao.selectUser();
request.setAttribute("userList",userList);
return SUCCESS;
}
}
==============================
最后贴上貌似用不上的UserDAO.javapackage test;import java.util.List;
import java.util.ArrayList;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;public class UserDAO  extends SqlMapClientDaoSupport implements IuserDAO{
public List selectUser()
{
try {
List list = (List) getSqlMapClientTemplate().queryForList(
"selectUser");
return list;
} catch (Exception e) {
e.printStackTrace();
}
List list2=new ArrayList();
list2.add("aaa");
return list2;

}
}经调试发现程序根本没走这个悲催的UserDAO

解决方案 »

  1.   

    空指针异常,错误如下:
    ==============================
    严重: Servlet.service() for servlet [default] in context with path [/FK_SSI] threw exception [java.lang.NullPointerException] with root cause
    java.lang.NullPointerException
    at test.User.execute(User.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:184)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
      

  2.   

    插!内容过长,分两次贴
    =======================
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
    at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
    at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:163)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:556)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:267)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:245)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:260)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
      

  3.   

    你怎么又在 XML 文件中配置注入,又在用自动装配的扫描标签啊?
      

  4.   


    <constant name="struts.objectTypeDeterminer" value="notiger" />      
         <constant name="struts.objectFactory" value="spring" />   
         <constant name="struts.objectFactory.spring.autoWire" value="name" />  是这部分吗???这段是刚刚在网上看到的,不懂什么意思,然后直接贴上去的,刚刚试过了
    只用
    <constant name="struts.objectFactory" value="spring" />
    也不对………………
      

  5.   

    你把请求路径改为/test/select;就是前面加上/test;
    再测试是否有问题;
      

  6.   

    什么是请求路径??是action部分吗??刚接触这个不太懂这些术语
    我的是这样的
    <a href="<s:url action="/test/select"/>">点我看结果</a>
      

  7.   

    啊 ,我明白了。你根本没给USER 实体的操作注入DAO,你只是给他做了一个事务代理的注入,所以没有找到DAO。还有就是直接DAO本身就有事务单个操作的话,没有业务层干嘛使用 这个事务代理呢?  <bean id="userDAOProxy"  
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager">
                <ref bean="transactionManager" />
            </property>
            <property name="target">     //应该不是在这里进行DAO的注入。应当提到UERS下。
                <ref local="userDAO" />   
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="insert*">PROPAGATION_REQUIRED</prop>
                    <prop key="select*">PROPAGATION_REQUIRED</prop>
                    <prop key="delete*">PROPAGATION_REQUIRED</prop>
                    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                </props>
            </property>
        </bean>
      

  8.   

    USER 中完全没有对DAO的注入,所以为空。
      

  9.   

    能进入execute 方法,这里不会是路径问题;
    你把
    <property name="userdao">
                <ref bean="userDAOProxy"/>
            </property>
    改为:
    <property name="userdao">
                <ref bean="userDAO"/>
            </property>
    先测试下;
      

  10.   

    <bean id="userDAOProxy"  
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager">
                <ref bean="transactionManager" />
            </property> 这个应该是一个事务代理吧。没有对单元DAO的组合,应该用不到这个事务代理。
      

  11.   

    主要是HTML和JSP/Servlet的根路径的区别;知道
    JSP/Servlet是在Web服务器上解释的;
    HTML是在浏览器上解释的;
    就可以了;
      

  12.   

    我测试了,结果就是userdao为空
    经证明程序根本就没走userDAO类,所以没办法实现注入
    总感觉struts与spring间应该有个交接,但就是不知道该怎么交接
      

  13.   

    直接给USER中注入 uesrDAO 就OK了。那个事务代理在你执行多种服务的时候在使用。比如有一种 同时执行两个数据新增操作的时候 就可以对那个组合后的业务BEAN 注入那个事务代理带达到控制多个单元造作的造成的事务问题。
      

  14.   


    对对对,我也感觉是这样,但不知道该怎么对DAO注入,还有“对单元DAO的组合”是什么意思,初学,不太懂,别笑我,哈哈
      

  15.   

    单个DAO的操作是用不到  
    <!-- Struts2 action类 -->
        <bean id="user" class="test.User" >
            <property name="userdao">
                <ref bean="userDAO"/>
            </property>
        </bean>
    <!-- 实体DAO类的代理类 -->
        <bean id="userDAOProxy"  
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager">
                <ref bean="transactionManager" />
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="insert*">PROPAGATION_REQUIRED</prop>
                    <prop key="select*">PROPAGATION_REQUIRED</prop>
                    <prop key="delete*">PROPAGATION_REQUIRED</prop>
                    <prop key="update*">PROPAGATION_REQUIRED</prop>
                    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                </props>
            </property>
        </bean>
    </beans><bean id="USERBizProxy" parent="userDAOProxy">
    <property name="target" ref="user"></property>
    </bean>
    要用到这个代理类也该这么写,你的三层少了一层。
      

  16.   

    是ibats的mapper对象没有被实例,也就是说UserDao没有被注入到你的User中,
    你的 UserDAO 实现的接口为IuserDAO ,那么
    1.将你的sqlMapConfig.xml 改为“IuserDAO.xml”
    2.<sqlMap namespace="test">改为 <sqlMap namespace="test.IuserDAO">否则xml找不到对应的接口
      

  17.   

     如果你是打算用自动扫描呢, 那你没有配置扫描路径和对DAO类的注解 ,如果是打算用配置文件注入呢 那就没有注入UserDao,看见你在applicationContext.xml配置了一个实体类DAO  你把bean的名称跟你在java文件中注入的实现类名称统一试试
      

  18.   

    汗,还是不行
    我直接用
    <bean id="name" class="test.User">
    <property name="name" value="张大三"/>
    </bean>
    注入然后在User类中输出name都没有值,感觉问题还是出在struts托管spring的部分,SSI用不用在ACTION部分实例化spring容器然后getBean啊?如果不用到底该如何配置??我真都疯了
      

  19.   

    直接在user 中加入userDAO 不使用代理试试看 
      

  20.   

    DAO 中的方法只是对单个实体的增删改 查,所以我将其理解为单元操作。这种单个操作本身就有他们在自动事务,那个代理类,就是你注释所写的那个 DAO代理的BEAN那是一个事务代理,那个使用在 将单元操作组合的时候,比如你按 一个按钮的时候要同时对 A 类 和B 类 同时进行数据修改,这个时候就是一个单元的组合,如果没有事务控制,就有可能造成 A 变了 B没变 的情况,就好比银行转账吗。 所以我们要用到SPRING的事务代理来控制事务,如果A 或B 其中一个有一个修改是发生异常导致 单元操作事务回滚的时候,这个组合操作所绑定的另外一个类的 单元操作也会回滚, 然后就不会出现 一个改了另外一个没有改的问题。我这里有以前学习的时候做的例子的 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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <!--数据源-->
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName"
    value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
    </property>
    <property name="url" value="jdbc:sqlserver://localhost:1433"></property>
    <property name="username" value="sa"></property>
    </bean>

    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation"
    value="file:src/hibernate.cfg.xml">
    </property>
    <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--DAO类单元操作-->
    <bean id="BankDAO" class="com.aminy.dao.impl.BankDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <!--业务组合操作 何以进行多个DAO的注入 来实现复杂操作-->
    <bean id="zhuanzhangBiz" class="com.aminy.biz.impl.Zhuanzhang">
    <property name="bankDAO" ref="BankDAO"></property>
    </bean>
    <!--事务管理类-->
    <bean id="tm" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!--事务代理工厂类-->
    <bean id="abstractProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
    <property name="transactionManager" ref="tm"></property>
    <property name="transactionAttributes">
    <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
    </props>
    </property>
    </bean>
    <!--具体业务的事务代理,使业务组合操作的事务收事务代理的控制-->
    <bean id="zhuanzhangBizProxy" parent="abstractProxy">
    <property name="target" ref="zhuanzhangBiz"></property>
    </bean>

    </beans>

      

  21.   

    没有SET方法啊 User里。
    <bean id="name" class="test.User">
     <property name="name" value="张大三"/>
    </bean>引用得有SET方法吧
      

  22.   

    怎么加??我的工程名是FK_SSI
      

  23.   

    User类里有,我省略了,没贴出来
      

  24.   


    你这里是在Action中没有setName方法;不是很了解Strtus2;但是看你这里的配置是:
    <constant name="struts.objectFactory" value="spring" />   
    <constant name="struts.objectFactory.spring.autoWire" value="name" /> 
    spring会根据name注入,你注释下面的配置:
    <!-- Struts2 action类 -->
     <!--   <bean id="user" class="test.User" >
            <property name="userdao">
                <ref bean="userDAOProxy"/>
            </property>
        </bean>
        
        
        <bean id="name" class="test.User">
            <property name="name" value="张大三"/>
        </bean>-->
     同时把
    <bean id="userDAO" class="test.UserDAO">
    改为:
    <bean id="userdao" class="test.UserDAO">
    在测试;
      

  25.   

    <!-- Struts2 action类 -->
      <!-- <bean id="user" class="test.User" >
       <property name="userdao">
       <ref bean="userDAOProxy"/>
       </property>
       </bean>
         
         
       <bean id="name" class="test.User">
       <property name="name" value="张大三"/>
       </bean>
    这是注册两个User BEAN了。你赋值的是名为“name”的这个USER实例。而你使用的是user这个实例,当然没有那些属性的赋值。
      

  26.   

    你写的怎么又有注解,又有配置文件,一个字乱。注解我好像也没看到要把那几个包做为spring要扫描的包啊。你的配置文件里面的userDao怎么用的是个接口类?
      

  27.   

    大哥你太帅了!

    <bean id="userDAO" class="test.UserDAO">
    改为:
    <bean id="userdao" class="test.UserDAO">就是大小写的问题,但是为什么会这样啊,太神奇了
      

  28.   

    哇咔咔,第一个SSI终于运行出来了,感谢lcsky100、lxbccsu等传说级人物的帮忙,结贴,给分!!!
      

  29.   


    我也是刚入JAVA不久,以后还要相互学习,共同进步啊。哈哈。
      

  30.   


    你得会看 配置文件。这个很关键。ID 就是个别名,表名了 需要注入的是那个确定的JAVA类。不是大小写的问题,那个ID代表了你要注入的具体的bean.再好好理解下,配那个就不难了。
      

  31.   

    楼主 去看看spring 的属性注入 和构造注入吧