Dorado 9 : 虚拟属性(sample-center)

一般情况下DataType通过creatingType属性与一个POJO建立映射关系。其中DataType下的每一个PropertyDef都与POJO中的一个属性对应:

有时候我们希望可以添加一个PropertyDef,而这个PropertyDef并不与对应POJO中任何一个属性相关。这就好比为了开发的需要我们希望创建一个VO或DTO对象。

在DataType中新建虚拟属性非常简单,只要在内部添加一个BasePropertyDef就可以。

由于我们不会实际在对应的POJO中添加这个虚拟属性,那么通过Java代码完成虚拟属性的存取就有必要通过动态代理技术。在Dorado中提供了专门的工具类协助我们虚拟属性的设定,参考如下范例:

Product targetProduct = EntityUtils.toEntity(product);
EntityUtils.setValue(targetProduct, "prop1", RandomStringUtils.randomAlphanumeric(8));

首先通过EntityUtils的toEntity方法我们就可以将product对象转换为一个动态代理对象targetProduct,并通过EntityUtils工具完成对动态代理对象的虚拟属性"prop1"的赋值。

与此对应的动态代理对象虚拟属性的值的获取代码为:

String prop1 = EntityUtils.getString(targetProduct, "prop1");

sample-center中本例的页面效果如下:

其中产品分类对象中的产品名称是虚拟属性,我们看后台代码:

VirtualProperty.java
private Collection<MockCategory> generateCategories() {
	MockCategory category;
	Collection<MockCategory> categories = new ArrayList<MockCategory>();

	category = new MockCategory();
	category.setId(1);
	categories.add(category);

	category = new MockCategory();
	category.setId(3);
	categories.add(category);

	category = new MockCategory();
	category.setId(5);
	categories.add(category);

	category = new MockCategory();
	category.setId(6);
	categories.add(category);

	category = new MockCategory();
	category.setId(8);
	categories.add(category);

	return categories;
}

@DataProvider
public Collection<MockCategory> getCategories() throws Exception {
	Collection<MockCategory> categories = generateCategories();
	categories = EntityUtils.toEntity(categories);
	for (MockCategory category : categories) {
		EntityUtils.setValue(category, "categoryName", "CategoryName "
				+ category.getId());
	}
	return categories;
}

其中的DataProvider方法中就利用EntityUtils进行虚拟属性设定,我们再来看看MockCategory的定义:

package com.bstek.dorado.sample.data;

public class MockCategory {
	private long id;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
}

可以看到MockCategory的属性中是没有categoryName属性的。

Attachments: