OAF开发之EO:Validation数据校验

(一)摘要

1、在update数据之前,我们往往要对待更新的记录进行有效性的校验,校验级别包括:

(1)Attribute Level Validation:字段级的校验

(2)Entity Level Validation:记录级的校验

2、字段级校验 - 只涉及单个字段的校验

字段级别的校验一般情况下写在EO的set<Attribute name>()方法中,根据传入的value来决定是执行setAttributeInternal()还是throw Exception(代码应写在setAttributeInternal()之前)。例如你要限制ItemPrice字段的值不能超过100(当然也可以通过item的属性来设置)。伪码如下:

public void setItemPrice(Number value) {
	Number maxvalue = new Number(100);
	if (value.compareTo(100) > 0) {
		throw new Exception("Error: Item Price large then 100!");
	} else {
		setAttributeInternal(ITEMPRICE, value);
	}
}

当校验涉及多个Attribute时,你就不能使用字段级的校验了,需使用记录级的校验,即Entity Level Validation。此校验在validateEntity()方法中实现,校验代码须写在super.validateEntity()之后。

例如如果一个订单的状态为CLOSE,则不允许更改OrderPrice。伪码如下:

public void validateEntity() {
	super.validateEntity();
	String status = getOrderStatus();
	if ("CLOSE".equals(status)) {
		Number ldorderprice = (Number) getPostedAttribute(ORDERPRICE);
		Number neworderprice = (Number) getOrderPrice();
		if (oldorderprice.compareto(neworderprice) != 0) {
			throw new Exception("Error: Order Price can not be edited!");
		}
	}
}

备注:getPostedAttribute()方法用来取得字段未修改前的值。

另外,User's Guide里介绍了多EO之间的校验,这留待后面再研究吧。

(二)字段级校验案例

案例:在EO的字段添加异常,如果Total为0值,则抛出异常。

1、字段级验证异常调用

字段级验证异常调用

图1:字段级验证异常调用

2、字段级验证异常测试

字段级验证异常测试

图2:字段级验证异常测试

(三)记录级校验案例

案例:在EO的记录级validateEntity()添加异常,将多个字段组合进行判断,则抛出异常。

1、记录级验证异常调用

记录级验证异常调用

图3:记录级验证异常调用

2、记录级验证异常调用测试

记录级验证异常调用测试

图4:记录级验证异常调用测试

(四)异常触发后如何对transaction进行rollback

不要试图在EO的Validation里执行rollback()方法或clearcache()方法,当出现校验失败时,有下面两种做法:

Bad Method:

// In EO Module
public void validateEntity() {
	……
	transaction.rollback()
	throw new OAException….
}

Right Method:

// In EO Module
public void validateEntity() {
	throw new OAException…
}
// In AM Module :
try {
	transaction.commit();
} catch (OAException ex) {
	transaction.rollback();
	}
}

参考资料:

1. OAF_OAF EO系列 - Validation数据校验验证机制(概念)

本文标题:OAF开发之EO:Validation数据校验

本文链接:http://yedward.net/?id=219

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章