java.lang.NullPointerException
    at com.sunwave.action.privilege.UserAction.findUserPageInfo(UserAction.java:78)省略N字
框架:SSH,service在Action中注入,配置文件如下:
<!--用户管理-->
<bean id="userAction" class="com.sunwave.action.privilege.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
<property name="systemParameterService" ref="systemParameterService"></property>
</bean>
<bean id="userService" class="com.sunwave.service.impl.privilege.UserServiceImpl"
parent="baseService">
<property name="roleService" ref="roleService"/>
<property name="empService" ref="empService"/>
<property name="systemParameterService" ref="systemParameterService"/>
<property name="userDao"><ref bean="userDao"/></property>
</bean>    
<bean id="userDao" class="com.sunwave.dao.impl.privilege.UserDaoHibImpl" 
  parent="baseDAO">
</bean>
一般情况下,不会出现该错误,系统发布到公网后偶现,初步怀疑是高访问量的并发性错误,怀疑是否和service的单例模式有关,求解~~javassh并发

解决方案 »

  1.   

    应该把代码和信息贴全吧,
    比如at com.sunwave.action.privilege.UserAction.findUserPageInfo(UserAction.java:78) 这一块的代码
      

  2.   

    scope="prototype"你配置这个了,就打破单例模式了。这每次请求都创建一个新的action了。
      

  3.   

    参数问题应该可能性不大,即使存在,应该是ACTION匹配错误,现在的情况是action进去以后service为null,而且是偶现
      

  4.   

    是的,action是多态的,但是service和dao默认都是单例的
      

  5.   

    public String findUserPageInfo(){
    Map session = ActionContext.getContext().getSession();

    user.setUserLevel((Integer)session.get(USER_LEVEL));
    user.setLcId((Integer)session.get(USER_ID));
    Integer userType = (Integer)session.get(USER_TYPE);
    user.setCpUserType(userType);
    if((user.getUserLevel().equals(Common.SUPER_USER_LEVEL) || user.getUserLevel().equals(Common.SYSTEM_ADMIN_LEVEL))
    && userType.equals(Common.COMPANY_USER_TYPE)){
    }else{
    user.setUserType(userType);
    }
    user.setCpTopId((Integer)session.get(Common.USER_TOPID));
    if(user.getCorpId()== null)
    user.setCorpId((Integer)session.get(Common.USER_COMPANYID));
    infoMap=userService.findUserByCon(start,limit,user);
    return SUCCESS;
    }
      

  6.   

    UserAction.java:78 就是 infoMap=userService.findUserByCon(start,limit,user);  这一行?
      

  7.   

    让我测试人员去试试,我给异常加个catch断点
      

  8.   

    Map session = ActionContext.getContext().getSession();     
    ......   
    infoMap=userService.findUserByCon(start,limit,user);你这个action我至少看到了两个存在安全隐患。1. Struts已经不建议在action里通过ActionContext.getContext()获取session了。官方已经说,可能会出现为空现象,可以到官网看康。
    2.使用userService前应该判断下是否为空,这是良好的编程习惯。
      

  9.   

    1.嗯,感谢建议,一般都在从request里面取session的,非本人代码,做改进
    2.从安全角度,userService是该先判断null,但是正常逻辑,spring注入service是不会为空的,总不能因为某些地方BUG而加一段空判断的冗余代码吧
      

  10.   

    缺少jar包  你仔细看一下 可能是缺spring和struts相联系的包
      

  11.   

    缺少架包这种事情怎么好意思发生struts2-spring-plugin-2.0.11.1.jar我用的是这个
      

  12.   

    经过多次调试,我发现在以下情况会出现如上BUG,就是用户登录系统后,建立session,然后再用出错的那个action地址直接在浏览器里面输入访问,由于没有带参数,所以会出现空指针错误。至于在什么情况下会出现该操作不清楚,我想用户应该不会无聊到手动输入一个ACTION的地址如果是这个原因引起,问题的重点就变成要怎么屏蔽这些操作,比如一个用户登录后,他想试试获取更大权限的数据,然后他就输入用户管理模块的action地址,或者就是故意攻击服务器,不断产生异常,甚至写个脚本,不停发ajax请求,但是他请求的action地址又是符合struts拦截规则,甚至带点不对的参数,OH,MY GOD