struts2通过表单提交POJO对象出错,生成的POJO类只有一个属性。我要通过JSP向Action提交一个封装用户信息的POJO对象,对象是顺利生成了,但是只有一个属性有值,其他都是null。在Action上面加了断点发现request里边的参数和值都正常,POJO类属性的get和set方法都有了,action类上也给POJO类实例加了set方法。百思不得其解。
之前也遇过这个问题,因为开发进度非常紧,临时给Action多设置了几个属性,加上get和set,然后自己手动在action内拼装成pojo了事。不想今天再次遇到。晚上终于在一篇文章里找到原因:
struts2技巧与解惑——为什么我的表单参数只有一个生效(控制器对象属性没有或者只有一个被设置)
该博主在POJO类的set方法上打了断点,发现各属性的set方法都被调用了,但是不在一个实例上。经过分析,其逻辑如下:
Action的代理会遍历request里面获取到的每一个键值对。
对于每一个键值对,代理会先检查Action是否有该属性。如有,则尝试调用set方法赋值。
对于非基础类型的属性,代理会先尝试获取该属性,如无法获取(没有get方法)或者获取结果为null,则调用其构造方法。
经过步骤3,代理已经拥有一个该对象的实例了,好,调用该实例相应的set方法,把当前这个键的值set进去。再调用Action类的set方法把这个实例丢进去。
过了一会,又有一个键值对对应上述的这个对象。代理已经不记得手头上曾经有一个实例了,只好再次尝试获取该属性,不好意思没有get方法,重新new一个实例,再重复步骤4。原来那个实例则等着被回收。
如此反复,最终只有最后一次被赋值的那个实例存在,其只有一个属性有值,其他都是null。
解决办法即是,加上get方法