`
chenjingbo
  • 浏览: 459659 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2.0.14对象注入的一个问题(姑且算是一个BUG)

阅读更多

1 问题的起因

    遇到这个问题的时间很悲剧,刚好在项目发布的当头.在运营修改一些业务数据的时候发现某一个参数无法修改!!!怎么传都传不了.注意,只有一个参数是无法修改的.其他的参数都可以

    我马上查看源码,发现这个参数的名字是

<input type="text"  value="<s:property value='couponBuy.bookPhone'/>" name="couponBuy.bookPhone" id="coupon-order-r3-desc" >

 但是通过修改代码debug发现,在Action中打印出这个参数信息却是是null.初步的判断是页面传到Action的时候造成了参数的丢失.然后通过firebug查看,发现'couponBuy.bookPhone'确实是有值的..线索由此断了.中间折腾了差不多两个小时,一直无法解决.最后通过修改参数传入名字

<input type="text"  value="<s:property value='couponBuy.bookPhone'/>" name="bookPhone" id="coupon-order-r3-desc" >

 

然后在Action中自己手工注入到couponBuy对象中..采取了这种临时的解决方案

2  后续的跟进

    新建了新的web工程,进行测试,努力模拟当时的情况,在什么情况下会出现这种无法注入的情况.经过一番折腾.终于发现元凶.元凶的代码是

public CouponBuy getCouponBuy() {
		if (couponBuy == null) {// 表示是新增操作,必须首先赋值CategoryId
			couponBuy = new CouponBuy();
			couponBuy.setCategoryId(CouponBuyUtil.getCategoryId());
			couponBuy.setPublishUserName(this.getUser().getUserName());
		}
		return couponBuy;
	}

 很明显,上面这个是couponBuy对象的get方法.一般来说,struts2在依赖注入的时候会先调用这个方法(由于业务逻辑需要,所以必须自己去创建couponBuy对象).但是我注意到,运营在修改couponBuy对象的时候是不需要登录的!!也就是说,照理来说,这里应该会报一个空指针异常..根据这个情况,进行模拟.

pojo类

/**
 * @author zhenghui 
 * @version 1.0 
 * @date 2011-6-2 下午04:57:47
 * 
 */
public class CouponBuy implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -3869627789513451015L;
	
	private String bookPhone;
	private String name;
	private String descrbtion;
	private String abc;
// get set 方法略
}

 

对应的Action

 

package com.koubei.action;

import com.koubei.pojo.CouponBuy;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author zhenghui E-mail: zhenghui.cjb@taobao.com
 * @version 1.0 
 * @date 2011-6-2 下午04:36:37
 * 
 */
public class SubmitAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6074612093907655532L;
	
	private CouponBuy couponBuy;
	
	
	@Override
	public String execute() throws Exception {
		System.out.println(couponBuy.getBookPhone());
		System.out.println(couponBuy.getName());
		System.out.println(couponBuy.getDescrbtion());
		System.out.println(couponBuy.getAbc());
		return super.execute();
	}

	public CouponBuy getCouponBuy() {
		if(couponBuy == null){
			couponBuy = new CouponBuy();
			throw new NullPointerException();
		}
		return couponBuy;
	}

	public void setCouponBuy(CouponBuy couponBuy) {
		this.couponBuy = couponBuy;
	}
	

}

 直接抛出空指针异常,然后传入对应的参数

http://localhost/WebTest/submit.html?couponBuy.name=name&couponBuy.descrbtion=desc&couponBuy.bookPhone=05714788339&couponBuy.abc=abc

 结果是

05714788339
name
desc
null

 

也就是说,abc参数丢失了!!.问题在于:

1 传入4个参数,但是couponBuy.abc 这个参数丢失了!其他都正常

2 最大的问题是,竟然没有报错的日志!!console下没有,结果页也是正常的,就是没这个参数而已...

    问题终于发现,就是由于struts2在给我们做对象的注入的时候,会把空指针异常给吃了.然后会把某一个参数注入为Null.但是其他的参数都注入正常.

3 继续查看问题

   这个问题虽然解决了,但是还是引出了其他几个问题.

(1)是否高版本的struts2还存在这个问题

(2)那个丢失的参数,规则是什么..

 

后续的解决

(1)这个问题我换成struts2.2.1版本来跑同样的程序.发现console日志输出里已经报了空指针异常.也就是说,高版本中这个吃异常的BUG已经修正了.但是还是会将某一个参数制空,其他参数正确传入.

(2)经过测试,struts2的规则是根据对象属性进行排序,在第一个注入的就会制空,后面注入的参数能正确被注入.比如上面的属性中 abc < bookPhone 所以abc首先被注入,所以丢失数据.如果我把abc属性删除,则bookPhone参数是最小的,则这个参数首先被注入,也就之前我在项目中遇到的丢失问题...

4 最后的总结.

struts2关于标签部分的代码没看,所以无法从根本上总结出这个BUG的所在..等待后人研究了..看源码的话没有这么快搞定..

0
0
分享到:
评论
1 楼 xulong1 2013-04-11  
楼主解决了没有啊,你对struts2没有理解吧,你少了bean的get方法,取到每一个属性时先调用get方法获取bean对象,如果该对象为空new出一个,下次不会再new

相关推荐

    struts2.0.14官方jar包

    Struts2.0.14官方jar包是Java Web开发中的一个重要组件,它是一个基于MVC(Model-View-Controller)设计模式的开源框架。Struts2为开发者提供了构建动态、数据驱动的Web应用程序的强大工具。这个特定版本的发布旨在...

    Struts2.0.14

    struts2.0.14 是根据 Struts2.0.14的官方文档生成

    struts2.0.14_apps

    Struts2.0.14_APPS 是一个包含多个示例应用程序的压缩包,主要用于演示Apache Struts 2.0.14版本的功能和用法。Struts 2 是一个流行的Java Web开发框架,用于构建MVC(Model-View-Controller)架构的应用程序,它...

    struts2.0.14-src 源代码(part1)

    struts2.0.14-src struts2.0.14 源代码

    struts2.0.14.chm

    这个是我利用struts2.0.14的官方源代码和相关工具生成的chm文件,希望能给需要的人带来福音。

    struts2.0.14

    Struts2.0.14 是一个非常重要的Java Web开发框架,它基于MVC(Model-View-Controller)设计模式,极大地简化了企业级应用的开发流程。此版本的Struts2是Apache软件基金会下的一个项目,其核心是提供一个用于处理HTTP...

    helloWorld-struts2.0.14.rar

    本教程“helloWorld-struts2.0.14.rar”旨在为初学者提供一个清晰易懂的入门起点,通过一个简单的实例帮助理解Struts2的核心概念和配置。 首先,Struts2.0.14是该框架的一个早期版本,它在当时的Java社区中广泛使用...

    [Struts2.0.14.API].Struts2.0.14.API

    Struts2.0.14.API 是一个针对Java开发者的重要参考资料,主要涵盖了Struts2框架的版本0.14的核心API。Struts2是Apache软件基金会下的一个开源项目,它是一个用于构建MVC(Model-View-Controller)架构的Java Web应用...

    最新版struts-2.0.14

    这个"最新版struts-2.0.14"是Struts2框架的一个特定版本,发布于2011年,虽然在现在看来可能不是最新的,但在当时它是一个稳定且广泛使用的版本。 Struts2的核心设计目标是提供一个可扩展的MVC(Model-View-...

    struts1.3.10 和 struts2.0.14 包

    Struts是Apache软件基金会下的一个开源项目,提供了一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。这个压缩包包含了Struts 1.3.10和Struts 2.0.14两个版本,它们分别代表了Struts框架的发展...

    struts-2.0.14-lib Struts2开发包

    包含Struts2框架的核心类库,以及Struts2的第三方插件类库 struts2-core-2.0.14 xwork-2.0.7 ognl-2.6.11 commons-logging-1.0.4 freemarker-2.3.8 等等。

    struts-2.0.14-all.zip

    Struts 2.0.14 是一个较早版本的 Apache Struts 框架,它是一个基于模型-视图-控制器(MVC)设计模式的Java Web应用程序框架。Struts 2 提供了用于构建企业级应用的结构,允许开发者更轻松地处理HTTP请求、业务逻辑...

    struts2.0.14-src 源代码(part2)

    struts2.0.14-src struts2.0.14 源代码

    struts 2.0.14-lib

    Struts 2.0.14 是一个非常重要的版本,它是Apache Struts框架的一个发行版,专注于提供MVC(Model-View-Controller)架构来构建Web应用程序。这个框架以其灵活性、可扩展性和强大的功能而闻名,是Java企业级开发中的...

    Struts2.0.14 API CHM

    Struts2.0.14 API CHM 是一个关于Apache Struts 2框架的API文档,以CHM(Microsoft帮助文件)格式提供。这个文档详细介绍了Struts2框架的类库、接口、方法以及相关配置,是开发人员进行Struts2应用开发的重要参考...

    Struts 2.0.14 API

    Struts 2.0.14 API Struts 2.0.14 API Struts 2.0.14 API

    struts-2.0.14

    Struts 2.0.14 是一个历史悠久的版本,它是Apache Struts框架的一个关键更新。Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它使得开发人员能够更有效地构建动态、数据驱动的Web...

    struts2.0.14 api 最新 chm

    struts2.0.14 api 最新 索引 chm

    struts-2.0.14源码

    struts-2.0.14jar包源码,可以用来查询里面的类的具体实现

    struts2.0.14.jap 架包 rar

    Struts2.0.14.JAP 架包是一个针对Java应用程序开发的开源框架,主要用于构建基于MVC(Model-View-Controller)设计模式的Web应用。这个RAR压缩包包含了Struts2框架的完整版本,版本号为0.14,专为日本地区的开发者...

Global site tag (gtag.js) - Google Analytics