我的页面代码是这样的:<html>
  <head>  
    <title>公告添加</title>
 </head>
  <s:head/>
  <body>
    <h5 align="center">添加公告</h5>
     <table align="center" border="1" width="40%">
      <center>
    <s:form action="dormNoticeControl!addNotice.action" >   
      <s:textfield name="dormNoticeinfo.title" label="公告题目"/>
      <s:textfield name="dormNoticeinfo.type" label="公告类型"/>
        <s:textarea name="dormNoticeinfo.content"  rows="5" cols="20" label="公告内容"/>
         <s:textfield name="dormNoticeinfo.issuer" label="发布人"/>
      <s:textfield name="dormNoticeinfo.published" label="发布时间"/>
     
     <tr>
      <td colspan="2" align="center">
         <s:submit  theme="simple"  value="保存"/>
         <s:reset  theme="simple"  value="重置"/> 
      </td>
     </tr>
 </s:form> 
    </center>
    </table>
  </body>
</html>
DAO里的代码是这样的:public void addNotice(AbstractdormNoticeInfo dormNoticeinfo) {  //添加新的公告
Session session=getSession();
Transaction tra=session.beginTransaction();
System.out.println("dormNotice="+dormNoticeinfo);
session.save(dormNoticeinfo);
tra.commit();
session.close();

}
运行结果报错如下:dormNotice=null
2010-7-4 9:00:38 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:40)
at org.hibernate.event.SaveOrUpdateEvent.<init>(SaveOrUpdateEvent.java:23)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at com.txsm.crm.dao.impl.DormNoticeDAO.addNotice(DormNoticeDAO.java:20)
at com.txsm.crm.service.impl.DormService.addNotice(DormService.java:22)
at com.txsm.crm.action.DormNoticeAction.addNotice(DormNoticeAction.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

解决方案 »

  1.   

    是不是没写set/get方法?
      

  2.   

    首先你要在后台定义一个  dormNoticeinfo  对他提供setter()  而且要保证.dormNoticeinfo他的类的属性都有getter setter方法..struts2获取页面的值,他是根据属性的setter()注入的. 
      

  3.   

    检查下  action中的属性是否有get/set,然后看看你是否添加了自己的拦截器之后把默认的拦截器栈忘记了
      

  4.   

    在action类中提供模型驱动啊private DormNoticeinfo dormNoticeinfo;再提供setter方法
      

  5.   

    at com.txsm.crm.dao.impl.DormNoticeDAO.addNotice(DormNoticeDAO.java:20)
        at com.txsm.crm.service.impl.DormService.addNotice(DormService.java:22)
        at com.txsm.crm.action.DormNoticeAction.addNotice(DormNoticeAction.java:34)看看出错信息找原因
      

  6.   

    老大们!!
    我有get 和 set 方法啊
      

  7.   

    这是我的action类:package com.txsm.crm.action;
    public class DormNoticeAction extends ActionSupport {

    protected AbstractdormNoticeInfo dormNoticeinfo;// 实体类

    protected IDormService dormService;    

    public String execute() throws Exception {
    return null;
    }
    public String addNotice() throws Exception { //添加公告
    System.out.println("在action里的dormNotice="+this.getDormNoticeinfo());
    dormService.addNotice(this.getDormNoticeinfo()); 

    return SUCCESS;
    } public String deleteNotice() throws Exception {  //删除公告
    HttpServletRequest request=ServletActionContext.getRequest(); String strId=request.getParameter("id");
    int id=Integer.parseInt(strId);
    System.out.println("id="+id);
    //dormNoticeinfo.setId(id);
    //System.out.println("dormNoticeinfo="+dormNoticeinfo.toString());
    //dormService.deleteNotice(dormNoticeinfo);
    dormService.deleteNotice(id);
    return SUCCESS;
    }

    public String preupdateNotice() throws Exception{  // 修改公告预处理 
    HttpServletRequest request=ServletActionContext.getRequest();
    String strId=request.getParameter("id");
            
            if(strId==null){
             return ERROR;
            }
            else{
              int id=Integer.parseInt(strId);
                 System.out.print("id="+id);
                 List list=new ArrayList();
                list=dormService.selectNotice(id);
                if(list.size()>0){
                ActionContext act=ActionContext.getContext();
                Map map=act.getSession();
                 map.put("updateNotice", list);
                }
               else return ERROR;
            }
          
    return "update";

    }
    public String updateNotice() throws Exception{

    HttpServletRequest request=ServletActionContext.getRequest();
    String strId=request.getParameter("id");
    int id=0;
            if(strId==null){
             return ERROR;
            }
            else{
              id=Integer.parseInt(strId);
            }
            dormNoticeinfo.setId(id);
    dormService.updateNotice(dormNoticeinfo);


    return SUCCESS;
    }

    public String selectNotice() throws Exception {   //查询最新公告

    List list=new ArrayList();

    list=dormService.selectNotice(dormNoticeinfo);

    if(list.size()>0){

    ActionContext act=ActionContext.getContext();
    Map map=act.getSession();
    map.put("newNotice", list);
    }
    else{
    return ERROR;
    }

    return "select";
    }
    //下面是get set方法
    public AbstractdormNoticeInfo getDormNoticeinfo() {
    return dormNoticeinfo;
    }
    public void setDormNoticeinfo(AbstractdormNoticeInfo dormNoticeinfo) {
    this.dormNoticeinfo = dormNoticeinfo;
    }
    public IDormService getDormService() {
    return dormService;
    }
    public void setDormService(IDormService dormService) {
    this.dormService = dormService;
    }


    }
      

  8.   

    public void addNotice(AbstractdormNoticeInfo dormNoticeinfo) {  //添加新的公告
            Session session=getSession();
            Transaction tra=session.beginTransaction();
            System.out.println("dormNotice="+dormNoticeinfo);
            session.save(dormNoticeinfo);
            tra.commit();
            session.close();
            
        }
    dormNoticeinfo有get 和set方法吗?如果有,把public void addNotice(AbstractdormNoticeInfo dormNoticeinfo)改成public void addNotice()看看!
      

  9.   

    你看看 是不是实体类中的某些属性没有给附上值 在 session.save(dormNoticeinfo)加个断点 。感觉是你给数据库大的某个属性负上空值了
      

  10.   

    如果有的话,你在   
     public void setDormNoticeinfo(AbstractdormNoticeInfo dormNoticeinfo) {
            this.dormNoticeinfo = dormNoticeinfo;
        }
    设置断点,看是否执行,还有看你的action是不是单例的,如果是的话,你在前面执行该action时候,是否有给dormNoticeinfo注入值,如果没有,你又使用的是单例,那么就很有可能是你的action已经实例化了,后面再执行add时候,调用已经实例化的action,而实例化的时候又没有给dormNoticeinfo注入值。所以出错
    个人猜测,不知道对不
      

  11.   

    应该不是 DAO里的问题吧
    action里就没有获得数据啊
    我好象不会什么加断点调试的
      

  12.   


    看你的action是不是单例的,如果是的话,你在前面执行该action时候,是否有给dormNoticeinfo注入值,如果没有,你又使用的是单例,那么就很有可能是你的action已经实例化了,后面再执行add时候,调用已经实例化的action,而实例化的时候又没有给dormNoticeinfo注入值。所以出错
    你的action是用spring管理的吧,spring对于实例化有単例和多例的说话,楼主懂不?
      

  13.   

    我加了System 语句 public AbstractdormNoticeInfo getDormNoticeinfo() {
    System.out.print("这里是否成功运行到?????  get方法 ");
    return dormNoticeinfo;

    }
    public void setDormNoticeinfo(AbstractdormNoticeInfo dormNoticeinfo) {
    this.dormNoticeinfo = dormNoticeinfo;
    System.out.print("这里是否成功运行到?????  set方法");
    }
    结果控制台打印出:信息: Server startup in 7167 ms
    这里是否成功运行到?????  get方法 这里是否成功运行到?????  get方法 这里是否成功运行到?????  get方法 这里是否成功运行到?????  get方法 这里是否成功运行到?????  get方法 这里是否成功运行到?????  get方法 在action里的dormNotice=null
    这里是否成功运行到?????  get方法 sessionFactory=org.hibernate.impl.SessionFactoryImpl@106bde8
    dormNotice=null
      

  14.   

    那就说明,你的action是単例的,在spring容器创建时候就实例化了你的action。你在你的sping配置文件的中,给这个action 加上个scope="protype",不知道是不值这样拼写的,你去看看怎么
    <bean   id= "dormNoticeAction "   class= "com.txsm.crm.action.DormNoticeAction " scope="protype",protype不知道写对没有,你去看看spring的bean的原子性
      

  15.   

    同意fan578,应该就是这个问题,我也跟楼主碰到是同样的问题,查了半天大家都说的跟fan578差不多,但是就是不知道怎么解决。
      

  16.   

    就是在你spring配置action的bean中加上scope=“protype”(原子性),默认是singlton
      

  17.   

    这个就不太明白了,主要我常使用struts2一般都用的多例做,単例很少,所以只能凭经验说这些