@gengzhengtao
2015-07-23T09:41:24.000000Z
字数 3312
阅读 1297
电商平台broadleafCommerce
Broadleaf概念
数据与服务模型
Broadleaf提供了两种数据结构存储类似于枚举的数据,BroadleafEnumerationType
和 DataDrivenEnumeration
.这两个在本质上就是一个字符串值的集合。BroadleafEnumerationType
用来提供业务逻辑预定义使用的值,而DataDrivenEnumeration
用来提供在像管理控制台下列菜单这种地方提供的一组变量值。
该BroadleafEnumerationType是实现创建预定义的硬编码字符串值的自定义枚举的接口。Broadleaf 框架中的FulfillmentType
就是一个例子。FulfillmentType
是包含对应FulfillmentGroup
类型可用的值。下面是FulfillmentType
对于BroadleafEnumerationType
是如何实现的:
public class FulfillmentType implements Serializable, BroadleafEnumerationType {
private static final long serialVersionUID = 1L;
private static final Map<String, FulfillmentType> TYPES = new LinkedHashMap<String, FulfillmentType>();
public static final FulfillmentType DIGITAL = new FulfillmentType("DIGITAL", "Digital");
public static final FulfillmentType PHYSICAL_SHIP = new FulfillmentType("PHYSICAL_SHIP", "Physical Ship");
public static final FulfillmentType PHYSICAL_PICKUP = new FulfillmentType("PHYSICAL_PICKUP", "Physical Pickup");
public static final FulfillmentType PHYSICAL_PICKUP_OR_SHIP = new FulfillmentType("PHYSICAL_PICKUP_OR_SHIP", "Physical Pickup or Ship");
public static final FulfillmentType GIFT_CARD = new FulfillmentType("GIFT_CARD", "Gift Card");
@Deprecated
public static final FulfillmentType SHIPPING = new FulfillmentType("SHIPPING", "Shipping");
public static FulfillmentType getInstance(final String type) {
return TYPES.get(type);
}
private String type;
private String friendlyType;
下面是怎么在业务逻辑使用FulfillmentType
if(!FulfillmentType.GIFT_CARD.equals(fulfillmentGroup.getType())) {
shippableFulfillmentGroups++;
}
DataDrivenEnumeration
是一个包含 DataDrivenenumerationValues
值列表的实体。DataDrivenEnumerationValue
也是一个实体,他提供了一个单一字符串值的结构。与之相反的 BroadleafEnumerationType
是使用硬编码的一组值。DataDrivenEnumeration
包含了一个可以根据需要进行改变的数据库存储的值。
下面是一个例子:如何使用DataDrivenEnumration
创建一个管理控制台的下拉列表,为了使用DataDrivenEnumration
给一个管理下拉列表提供的值,@AdminPresentation
注解要与@AdminPresentationDataDrivenEnumeration
注解一块使用,下面是一个例子:
注意:
@AdminPresentation
用来指定样式和所属域,AdminPresentationDataDrivenEnumeration
用于指定将DataDrivenEnumerationValue
特定子集值分配给该字段。
@Column(name = "TAX_CODE")
@AdminPresentation(friendlyName = "SkuImpl_Sku_TaxCode")
@AdminPresentationDataDrivenEnumeration(optionFilterParams = { @OptionFilterParam(param = "type.key", value = "TAX_CODE", paramType = OptionFilterParamType.STRING) })
protected String taxCode;
optionFilterParams
-改进查询的附加参数 用于指定在下拉菜单中哪些值是可见的param = "type.key"
-字段名称在目标实体中用来优化查询。在这种情况 type来自DataDrivenEnumerationValue
,key 来自DataDrivenEnumeration
。value = "TAX_CODE"
-该字段的值应于任何项目查询的返回值相匹配。paramType= OptionFilterParamType.STRING
-用来标注OptionFilterParam
注解中存储的值的类型。@AdminPresentationDataDrivenEnumeration
注解指定了字段TaxCode
将要被分配一个来自DataDrivenEnumerationValue
拥有type.key="TAX_CODE"
值集合的一个值。管理控制台将显示包含这组值得下拉菜单。
这里是备用的例子,举例说明创建一个下拉列表他的值来自 CategoryImpl.name:
@Column(name = "NAME")
@AdminPresentation(friendlyName = "CategoryImpl_Category_Name")
@AdminPresentationDataDrivenEnumeration(optionListEntity = CategoryImpl.class, optionValueFieldName = "name",
optionDisplayFieldName = "name", optionCanEditValues = true)
protected String name;
optionListEntity
指定应将呈现给用户在下拉列表中的选项列表中的查询的目标实体。在这里我们使用CategoryImple.class
optionValueFieldName = "name"
指定目标实体中的字段。这个字段的值将被存储在这个注解字段中。在这里我们使用CategoryImpl.name
.optionDisplayFieldName = "name"
-指定目标实体中的字段,这个字段包含了需要显示的值,这个值将会在下拉字段中展示给用户。在这里我们使用CategoryImpl.name
.optionCanEditValues = true
- 在下拉列表中用户能否编辑(或输入新的值)。@AdminPresentationDataDrivenEnumeration
注释指定字段名称将被从所有CategoryImpl.name
值的集合中分配一个值(无optionFilterParams
被用来细化查询)。