我再用jbpm开发工作流的时候需要将数据加入到自定义的表里。表字段只有id不为空,其他均可。
但是表单页面如果全部填写完成之后就不会进断点了,如果不填写完成就会报空指针错误,不知道为什么,我用的是SSH ,其中struts2。
下面是我的代码。运行到像数据库插入数据的那一步就会报错。请大家指点一二。谢谢。
public class OfficeBuyAction extends ActionSupport {
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private TaskService taskService;
private ExecutionService executionService;
private ProcessDefinition processDefinition;
private ProcessInstance processInstance;
private officeBuyService AssetServiceImpl;
private AssetsAppBuy asset;
private Employee employee;
    /**
     * @category 固定资产购买申请表(流程定义)
     * @date 2012/03/16 10:43
     * @author hjk
     * @return ""
     */
public String start() {
asset.setEmployee(employee.getEmpNo());
asset.setAssetsId("11111111");

try {
AssetServiceImpl.insert(asset);          -------在这里就会报错了
} catch (Exception e) {
e.printStackTrace();
}
return "buy"; }

解决方案 »

  1.   

    看看AssetServiceImpl这个对象是否为空。
    你是否使用了spring的ioc?你的这段代码是否全?
      

  2.   

    如果代码全的,那么你没有创建AssetServiceImpl的实例。所以AssetServiceImpl为null自然就会是空指针。
    如果用的是spring的ioc那么很明显你没有setAssetServiceImpl的方法。无法完成注入
      

  3.   

    如下是action 的代码  :
    package com.topwalk.oa.person.asset.action;import org.jbpm.api.Configuration;
    import org.jbpm.api.ExecutionService;
    import org.jbpm.api.ProcessDefinition;
    import org.jbpm.api.ProcessEngine;
    import org.jbpm.api.ProcessInstance;
    import org.jbpm.api.RepositoryService;
    import org.jbpm.api.TaskService;import com.opensymphony.xwork2.ActionSupport;
    import com.topwalk.oa.bo.Employee;
    import com.topwalk.oa.person.asset.bo.AssetsAppBuy;
    import com.topwalk.oa.person.asset.service.officeBuyService;@SuppressWarnings("serial")
    public class OfficeBuyAction extends ActionSupport {
    private ProcessEngine processEngine;
    private RepositoryService repositoryService;
    private TaskService taskService;
    private ExecutionService executionService;
    private ProcessDefinition processDefinition;
    private ProcessInstance processInstance;
    private officeBuyService AssetServiceImpl;
    private AssetsAppBuy asset;
    private Employee employee;
    /**
         * @category 固定资产购买申请表(启动流程)
         * @date 2012/03/16 10:42
         * @author hjk
         * @return "buy"
         */
    public String buy() {
    processEngine = Configuration.getProcessEngine();
    repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment().addResourceFromClasspath("/com/topwalk/oa/resource/asset/OfficeBuy.jpdl.xml").deploy();
    return "buy"; } /**
         * @category 固定资产购买申请表(流程定义)
         * @date 2012/03/16 10:43
         * @author hjk
         * @return ""
         */
    public String start() { asset.setEmployee(employee.getEmpNo());
    asset.setAssetsId("11111111");
    try {
    AssetServiceImpl.insert(asset);
    } catch (Exception e) {
    e.printStackTrace();
    }
    return "buy"; }


    public String service() {
    processEngine = Configuration.getProcessEngine();
    repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment().addResourceFromClasspath(
    "/com/topwalk/oa/resource/asset/OfficeService.jpdl.xml")
    .deploy();
    return "service"; } public String borrow() {
    processEngine = Configuration.getProcessEngine();
    repositoryService = processEngine.getRepositoryService();
    repositoryService.createDeployment().addResourceFromClasspath(
    "/com/topwalk/oa/resource/asset/OfficeBuy.jpdl.xml").deploy();
    return "borrow"; }
    public ProcessInstance getProcessInstance() {
    return processInstance;
    } public void setProcessInstance(ProcessInstance processInstance) {
    this.processInstance = processInstance;
    } public ProcessDefinition getProcessDefinition() {
    return processDefinition;
    } public void setProcessDefinition(ProcessDefinition processDefinition) {
    this.processDefinition = processDefinition;
    }

    public Employee getEmployee() {
    return employee;
    } public void setEmployee(Employee employee) {
    this.employee = employee;
    } public ExecutionService getExecutionService() {
    return executionService;
    } public void setExecutionService(ExecutionService executionService) {
    this.executionService = executionService;
    } public TaskService getTaskService() {
    return taskService;
    } public void setTaskService(TaskService taskService) {
    this.taskService = taskService;
    }

    public AssetsAppBuy getAsset() {
    return asset;
    } public void setAsset(AssetsAppBuy asset) {
    this.asset = asset;
    } public void setRepositoryService(RepositoryService repositoryService) {
    this.repositoryService = repositoryService;
    }

    public ProcessEngine getProcessEngine() {
    return processEngine;
    } public void setProcessEngine(ProcessEngine processEngine) {
    this.processEngine = processEngine;
    } public RepositoryService getRepositoryService() {
    return repositoryService;
    } public officeBuyService getAssetServiceImpl() {
    return AssetServiceImpl;
    } public void setAssetServiceImpl(officeBuyService assetServiceImpl) {
    AssetServiceImpl = assetServiceImpl;
    }
    }
      

  4.   


    如下是jsp的页面代码:我就概括的将给实体bean赋值的几个文本框注视为红色吧。后台是可以获取到值的。
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <%@ page import="java.text.SimpleDateFormat,java.util.Date" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>固定资产申请购买表</title>
    <link rel="stylesheet" href="../css/main.css" type="text/css"></link>
    <link rel="stylesheet" href="../css/skin.css" type="text/css" />
    </head>
    <style type="text/css">
    <!--
    body {
    margin-left: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
    background-color: #F8F9FA;
    }
    -->
    </style><%
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date currentTime_1 = new Date();
     %>
    <body bgcolor="#ffffff">
    <form action="asset!start.action" method="post" name="BuyForm">
    <table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
    <td width="17" height="29" valign="top"
    background="../images/mail_leftbg.gif">
    <img src="../images/left-top-right.gif" width="17" height="29" />
    </td>
    <td width="935" height="29" valign="top"
    background="../images/content-bg.gif">
    <table width="100%" height="31" border="0" cellpadding="0" cellspacing="0" class="left_topbg" id="table2">
    <tr>
    <td height="31">
    <div class="titlebt">
    资产申请购买表
    </div>
    </td>
    </tr>
    </table>
    </td>
    <td width="16" valign="top" background="../images/mail_rightbg.gif">
    <img src="../images/nav-right-bg.gif" width="16" height="29" />
    </td>
    </tr>
    <tr>
    <td height="71" valign="middle" background="../images/mail_leftbg.gif">
    &nbsp;
    </td>
    <td valign="top" bgcolor="#F7F8F9">
    <table width="100%" height="138" border="0" cellpadding="0"
    cellspacing="0">

    <tr>
    <td>
    <table width="100%" height="31" border="0" cellpadding="0"
    cellspacing="0" class="nowtable">
    <tr>
    <td class="left_bt2">
    &nbsp;&nbsp;&nbsp;&nbsp;表单参数设置
    </td>
    </tr>
    </table>
    </td>
    </tr>
    <tr>
    <td>
    <table width="100%" border="0" cellspacing="1" cellpadding="1">
    <tr>
    <td width="10%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    设备名称:
    </td>
    <td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    <input type="text" name="asset.assetsName" id="asset.assetsName" style="width: 160px" />
    <font color="red">*</font>
    </td>
    <td width="9%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    购置数量:
    </td>
    <td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    <input type="text" name="asset.assetsNumber" id="asset.assetsNumber" style="width: 160px" />
    <font color="red">*</font>
    </td>
    <td width="10%" id="CALLNATURE_GROUPDESC_TEXT" height="30" 
    align="right" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
    规格配置:
    </td>
    <td width="16%" height="30" align="left" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
    <input type="text" name="asset.assetsSpec" id="asset.assetsSpec" style="width: 160px" />
    <font color="red">*</font>
    </td>
    <td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    </td>
    </tr>
    <tr>
    <td width="10%" height="30" align="right"
    class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
        品牌型号:
    </td>
    <td width="16%" height="30" align="right"
    class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
    <input type="text" name="asset.assetsType" id="asset.assetsType" style="width: 160px" />
    <font color="red">*</font>
    </td>
    <td width="9%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2" 
    bgcolor="#f2f2f2">
    申&nbsp;请&nbsp;人:
    </td>
    <td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    <input type="text" name="employee.empNo" id="employee.empNo" style="width: 160px" />
    <font color="red">*</font>
    </td>
    <td width="10%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    申请部门:
    </td>
    <td width="16%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="left" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    <input type="text" name="asset.assetsUserDep" id="asset.assetsUserDep" style="width: 160px" />
    <font color="red">*</font>
    </td>
    <td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="left" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    </td>
    </tr>
    <tr>

    <td width="10%" height="30" 
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    申请日期:
    </td>
    <td width="16%" height="30" 
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    <input type="text" name="asset.assetsAppDate" id="asset.assetsAppDate" style="width: 160px" value="<%=formatter.format(currentTime_1) %>" disabled="disabled"/>

    <font color="red">*</font>
    </td>

    <tr>
    <td width="10%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    用途说明:
    </td>
    <td colspan="5" width="70%" height="30"
    align="left" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    <textarea rows="2" cols="5" name="asset.assetsUseFor"  id="asset.assetsUseFor" style="width: 720px"></textarea>
    </td>
    <td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    </td>
    </tr>
    <tr>
    <td width="10%" height="30"
    align="left" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
    预估价格/供货情况:
    </td>
    <td colspan="5" width="70%" height="30" align="left"
    class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
    <textarea rows="2" cols="5" name="asset.assetsPrice" id="asset.assetsPrice" style="width: 720px"></textarea>
    </td>
    <td width="20%" height="30" id="CALLNATURE_GROUPDESC_TEXT"
    align="right" bgcolor="#f2f2f2" class="TDEVEN,left_txt2">
    </td>
    </tr>
    <tr>
    <td width="100%" colspan="6" height="30" 
    align="center" class="TDEVEN,left_txt2" bgcolor="#f2f2f2">
    <input type="submit" name="save_button" value="确定">
    &nbsp;
    <input type="button"name="save_button" value="取消">
    </td>
    </tr>
    </table>
    </td>
    </tr>
    </table>
    </td>
    </tr>
    </table>
    </td>
    <td background="../images/mail_rightbg.gif">&nbsp;</td>
    </tr>
    <tr>
                    <td valign="middle" background="../images/mail_leftbg.gif">
                 <img src="../images/buttom_left2.gif" width="17" height="17" />
                </td>
         <td height="17" valign="top" background="../images/buttom_bgs.gif">
      <img src="../images/buttom_bgs.gif" width="17" height="17" />
    </td>
            <td background="../images/mail_rightbg.gif">
      <img src="../images/buttom_right2.gif" width="16" height="17" />
    </td>
       </tr>
    </table>
    <div style="color:red">
         <s:fielderror />
    </div>
    </form>
    </body></html>
      

  5.   

    错误如下:
    java.lang.NullPointerException
    at com.topwalk.oa.person.asset.action.OfficeBuyAction.start(OfficeBuyAction.java:89)
    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:441)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)而且每次启动tomcat 的时候都会抱update  progress 的错误。
      

  6.   

    在可以得情况下..你可以先把AssetServiceImpl这个首字母更新为小写..还有把spring里得在于AssetServiceImpl这个得配置贴出来吧..如果用得是byName方式。。
      

  7.   


    get set 方法都已经有了哦。
      

  8.   

    配置如下 :
    <bean id="AssetServiceImpl" class="com.topwalk.oa.person.asset.service.officeBuyServiceImpl"></bean>还有,大小写有什么问题吗?
      

  9.   

    嗯。
    你Spring配置文件里面。有这样一句话得存在吗?
    default-autowire="byName"
      

  10.   

    at com.topwalk.oa.person.asset.action.OfficeBuyAction.start(OfficeBuyAction.java:89)OfficeBuyAction.java 89 是哪一行?
      

  11.   


    你start方法有好几句话,能确定 89行是哪行么?
    public String start() {
    asset.setEmployee(employee.getEmpNo());
    asset.setAssetsId("11111111");
    try {
    AssetServiceImpl.insert(asset); -------在这里就会报错了
    } catch (Exception e) {
    e.printStackTrace();
    }
    return "buy";因为从你的错误堆栈信息中看,没有看到root cause,也就是说只能是第89行的问题,所以希望能再确认下89行是具体哪行?如果确定就是你标注的这行,那么就只能是 AssetServiceImpl 为空。也就是如果你改为:
    try {
    System.out.println(AssetServiceImpl); // 这里必然是null
    AssetServiceImpl.insert(asset); -------在这里就会报错了
    } catch (Exception e) {
    e.printStackTrace();
    }
    那么接下来就是检查你是靠哪行配置去设置AssetServiceImpl值的。
      

  12.   

    这个serviceimpl 是空....
    private officeBuyService assetServiceImpl;
            public officeBuyService getAssetServiceImpl() {
    return assetServiceImpl;
    } public void setAssetServiceImpl(officeBuyService assetServiceImpl) {
    assetServiceImpl = assetServiceImpl;
    }
    <bean id="assetServiceImpl" class="com.topwalk.oa.person.asset.service.officeBuyServiceImpl"></bean>这个就是app....xml的文件。再就没有地方用到这个类了啊。
      

  13.   

    你上面有一行代码错了,就是asset.setAssetsId("11111111");你执行insert插入是不允许插入的对象有Id值的!
      

  14.   

    AssetServiceImpl把这个的首字母写成小写,再看你注入的对不对。。空指针说明你把AssetServiceImpl这个对象并没有注入成功 。
      

  15.   

    感谢楼上的各位大侠。目前这个问题已经解决了。
     
         原因如下:
              @Autowired
    private officeBuyService assetServiceImpl;
    只因为没有这个@autowired ;我查了一下:
    这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
    <bean id="userDao" class="..."/>
    <bean id="userService" class="...">
        <property name="userDao">
          <ref bean="userDao"/>
        </property>
    </bean>
    这样你在userService里面要做一个userDao的setter/getter方法。
    但如果你用了@Autowired的话,你只需要在UserService的实现类中声明即可。
    @Autowired
    private IUserDao userdao;
    over !
    在此感谢大家。谢谢。