在RepositoryItem上的ATG JavaBean

时间:2016-11-28 19:17:59

标签: java oracle e-commerce javabeans atg

我不了解如何在ATG中使用repositoryItem。我如何在其上构建自定义逻辑。

我是否需要在repositoryItem上创建通常的JavaBean,或者我需要按原样使用它? 我会试着解释一下:

  1. repositoryItem上的逻辑:

    RepositoryItem store = getRepository().getItem(..);
    String address = store.getPropertyValue(..);
    
  2. JavaBean上的逻辑:

    class StoreBean {
      String address;
    
      StoreBean(RepositoryItem store) {
        address = store.getPropertyValue(..);
     }
    }
    
  3. 然后我可以使用StoreBean我想要的,获取它们的字段(例如,延迟加载它们)。

    ATG的最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

这是一个偏好的问题。

RepositoryItem个对象无法获得的是强类型检查。您必须对您正在使用的RepositoryItem类型进行假设,或者必须在代码中进行手动检查(请参阅下面的示例)。此外,由于RepositoryItem属性存储为元数据,因此您必须知道1)XML存储库描述符中属性的实际名称,以及2)您需要知道类型,这需要类型转换(示例: String firstName = (String) item.getProperty("firstName");)以下是确保RepositoryItem对象的类型为“sku”的验证示例:

RepositoryItemDescriptor skuItemDescriptor = getCatalogTools().getCatalog().getItemDescriptor(getCatalogTools().getBaseSKUItemType());
if (!RepositoryUtils.isTypeOfItemDesc(itemDescriptor, skuItemDescriptor)) {
    throw new IllegalArgumentException("RepositoryItem must be of type " + getCatalogTools().getBaseSKUItemType());
}

如果采用不使用“JavaBeans”的方法,则会增加应用程序中出现运行时错误的风险。我的建议是,在使用RepistoryItem对象和包装器对象之间保持健康的平衡。对于您计划在大量代码库中使用的关键项目,我建议使用包装器对象。

我建议如果您创建包装器对象,为了保持一致性,您遵循Oracle Commerce使用的相同设计模式。例如,“order”项由OrderImpl包装并实现ChangedProperties接口。

public class OrderImpl
extends CommerceIdentifierImpl
implements Order, ChangedProperties

http://docs.oracle.com/cd/E52191_03/Platform.11-1/apidoc/atg/commerce/order/OrderImpl.html

答案 1 :(得分:1)

ATG开箱即用存储库实现大多数情况下不使用JavaBeans。使用JavaBeans并将其延迟加载到内存中的一大缺点是会丢失许多存储库缓存功能,并会增加内存占用。例如,您将无法定期监视缓存统计信息或使缓存无效。当您从查询中获得巨大的repotiroyitem结果集时,您还将获得实例化的开销。

相反,您也可以使用DynamicBean,它允许您引用类似于例如Profile.city的Java bean的存储库属性。

如果您只想将它​​们包装起来,以免开发人员意外地错误地解析它们,那么您可以为每个存储库编写一个util类,用于各种类型的就绪写入操作,并集中管理您的类型安全。