问题描述
我用的是在Struts2中在jsp页通过struts2特殊标签讲对应的属性值封装成类传入action中,可是总是报空指针异常;目前所包含的条件有:1、实体类:其中包括了实体对象的各种set和get方法;2、实体映射文件:<hibernate-mapping><classname="com.rzq.bean.Userinfo"table="userinfo"catalog="rzq_3aweb"><idname="id"type="java.lang.Integer"><columnname="id"/><generatorclass="increment"></generator></id><propertyname="userId"type="java.lang.Integer"><columnname="userId"><comment>用户名</comment></column></property><propertyname="userName"type="java.lang.String"><columnname="userName"><comment>用户姓名</comment></column></property><propertyname="userPassword"type="java.lang.String"><columnname="userPassword"><comment>用户密码</comment></column></property><propertyname="userSex"type="java.lang.Integer"><columnname="userSex"><comment>用户性别</comment></column></property><many-to-onename="groupinfo"class="com.rzq.bean.Groupinfo"fetch="select"><columnname="groupId"><comment>组织机构ID</comment></column></many-to-one></class></hibernate-mapping>
3:action类:其中也定义了实体对象的set个get方法;publicclassSaveUserinfoActionextendsActionSupport{privateUserinfouserinfo;privateUserinfoServiceservice;publicUserinfogetUser(){returnuserinfo;}publicvoidsetUser(Userinfouserinfo){this.userinfo=userinfo;}publicUserinfoServicegetService(){returnservice;}publicvoidsetService(UserinfoServiceservice){this.service=service;}publicStringexecute()throwsException{this.service.save(this.userinfo);returnSUCCESS;}@Override@SuppressWarnings("unchecked")publicvoidvalidate(){Mapmap=this.getFieldErrors();Setset=map.keySet();for(Iteratoriter=set.iterator();iter.hasNext();){System.out.println(map.get(iter.next()));}}}
4:jsp页面<s:formaction="saveUserinfo"><s:textfieldname="userinfo.userId"label="用户名"value="2"></s:textfield><s:textfieldname="userinfo.userName"label="姓名"value="赵峥"></s:textfield><s:textfieldname="userinfo.userPassword"label="密码"value="123456"></s:textfield><s:textfieldname="userinfo.userSex"label="性别"value="1"></s:textfield><s:textfieldname="userinfo.group.groupId"label="部门"value="1"></s:textfield><s:submit></s:submit></s:form>
按道理说jsp页面中userinfo.userId这些属性这样写应该没有问题啊?
解决方案
解决方案二:
什么空指针action对象的吗
解决方案三:
还是把你报错的页面贴上吧
解决方案四:
引用1楼dracularking的回复:
什么空指针action对象的吗
对,从jsp页面传递到action的对象是空的!
解决方案五:
引用2楼aaameimei的回复:
还是把你报错的页面贴上吧
java.lang.NullPointerExceptionatcom.rzq.service.impl.UserinfoServiceImpl.save(UserinfoServiceImpl.java:51)atcom.rzq.action.userinfo.SaveUserinfoAction.execute(SaveUserinfoAction.java:43)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(UnknownSource)atsun.reflect.DelegatingMethodAccessorImpl.invoke(UnknownSource)atjava.lang.reflect.Method.invoke(UnknownSource)atcom.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)atcom.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)atcom.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)atcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)atcom.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)atcom.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)atcom.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)atcom.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)atorg.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)atcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)atcom.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)atcom.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)atcom.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)atcom.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)atcom.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)atcom.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)atcom.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)atcom.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
解决方案六:
你把jsp页面的userinfo改成user,或者把set方法改下。或者你干脆不提供set方法把属性改成public的。
解决方案七:
atcom.rzq.service.impl.UserinfoServiceImpl.save(UserinfoServiceImpl.java:51)把这代码附近贴出来看看啊
解决方案八:
你的userinfo对应的set,get方法咋不一致呢?
解决方案九:
Userinfo类中,对它所有的属性提供getset方法
解决方案十:
应该是getUserinfo()???怎么回事getUser()????
解决方案十一:
settergetter你用eclipse提供的自动生成功能就不会有错
解决方案十二:
那就是jsp页面的值没传到action去么可以在action中用打印的方法试一下看哪个值没取到一般没取到都是忘了写set,get方法
解决方案十三:
实现ModenDriven接口接收参数啊!
解决方案十四:
1检查set/get方法2注意要引用parameter拦截器(默认引入,如果在action里显示定义拦截器,必须显示引入它)
解决方案十五:
域对象的get和set生成错了,楼主或者可以用模型驱动实现。
解决方案:
你userinfo的get、set方法有问题吧
解决方案:
你action中的userinfo的setter方法是setUser你页面应该以user.userId而不是userinfo.userId;struts2是根据你的setter方法来注入对象的不是根据属性名
解决方案:
userinfo没有相应的get、set方法
解决方案:
引用16楼suciver的回复:
你action中的userinfo的setter方法是setUser你页面应该以user.userId而不是userinfo.userId;struts2是根据你的setter方法来注入对象的不是根据属性名
关键是我的表就是userinfo,我的实体类名也是Userinfo,我换成user干吗?
解决方案:
引用17楼xuxuexin1991的回复:
userinfo没有相应的get、set方法
packagecom.rzq.bean;/***Userinfoentity.**@authorMyEclipsePersistenceTools*/publicclassUserinfoimplementsjava.io.Serializable{//FieldsprivateIntegerid;privateGroupinfogroupinfo;privateIntegeruserId;privateStringuserName;privateStringuserPassword;privateIntegeruserSex;//Constructors/**defaultconstructor*/publicUserinfo(){}/**fullconstructor*/publicUserinfo(Groupinfogroupinfo,IntegeruserId,StringuserName,StringuserPassword,IntegeruserSex){this.groupinfo=groupinfo;this.userId=userId;this.userName=userName;this.userPassword=userPassword;this.userSex=userSex;}//PropertyaccessorspublicIntegergetId(){returnthis.id;}publicvoidsetId(Integerid){this.id=id;}publicGroupinfogetGroupinfo(){returnthis.groupinfo;}publicvoidsetGroupinfo(Groupinfogroupinfo){this.groupinfo=groupinfo;}publicIntegergetUserId(){returnthis.userId;}publicvoidsetUserId(IntegeruserId){this.userId=userId;}publicStringgetUserName(){returnthis.userName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetUserPassword(){returnthis.userPassword;}publicvoidsetUserPassword(StringuserPassword){this.userPassword=userPassword;}publicIntegergetUserSex(){returnthis.userSex;}publicvoidsetUserSex(IntegeruserSex){this.userSex=userSex;}}
这个就是我的userinfo实体类,get和set都有的!
解决方案:
引用15楼u011011528的回复:
你userinfo的get、set方法有问题吧
那你跟我说一下哪里有问题,我是没有看出来有问题啊!
解决方案:
你的action定义了属性privateUserinfouserinfo;那么对应的set和get方法应该是这样的:/***@returntheuserinfo*/publicStringgetUserinfo(){returnuserinfo;}/***@paramuserinfotheuserinfotoset*/publicvoidsetUserinfo(Stringuserinfo){this.userinfo=userinfo;}
楼主这个没看出来?
解决方案:
引用21楼splendid_java的回复:
你的action定义了属性privateUserinfouserinfo;那么对应的set和get方法应该是这样的:/***@returntheuserinfo*/publicStringgetUserinfo(){returnuserinfo;}/***@paramuserinfotheuserinfotoset*/publicvoidsetUserinfo(Stringuserinfo){this.userinfo=userinfo;}楼主这个没看出来?
请把String改为Userinfo,上面是举个例子。
解决方案:
的确是getter和setter方法有问题,至少这是问题的一部分原因。lz可能改过类变量然后忘记引入getter和setter方法了
解决方案:
是哎,action中的setget方法有问题,需要重新生成下。