通过代码获取AM的实例

十二月 12, 2009 in Oracle 融合中间件

Oracle ADF提供的ADF BC为我们的开发提供了极大的便利,其提供的声明式开发方式可以满足大部分业务需求,但有时我们可能需要在代码中获取AM的实例,完成一些特殊逻辑的处理,在ViewController中使用代码获取AM的实例的常用方式有如下几种:
1)基于AM的Configration创建
使用Configuration.createRootApplicationModule(serviceDefinition, serviceConfig)代码进行创建,接收的两个参数分别为:
serviceDefinition: AM的package路径,例如"hand.hadf.common.model.services.HadfFrameworkAM"
serviceConfig:使用AM中配置的Configuration的名称"HadfFrameworkAMLocal"
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  ……
  private String serviceDefinition = "hand.hadf.arpt.model.services.ArptAM";
  private String serviceConfig = "ArptAMLocal";
  private static ArptAM arptAM;
  ……
  /**
   * 获取AM实例
   */
  private ArptAM getArptService() {
    ArptAM service =
      (ArptAM)Configuration.createRootApplicationModule(serviceDefinition,
                                                        serviceConfig);
    return service;
  }
  ……



2)通过BindingContext获取

在BindingContext中可以直接获取当前DataBinding.cpx中定义的 DataControl,使用BindingContext对象的findDataSource方法,但需注意的是,此处的findDataSource 方法的参数为DataBinding.cpx中注册的dataControlUsages的对应的BC4JDataControl的id,例如:

<dataControlUsages>

    <BC4JDataControl id="HadfFrameworkAMDataControl" Package="hand.hadf.common.model.services"

                     FactoryClass="oracle.adf.model.bc4j.DataControlFactoryImpl" SupportsTransactions="true"

                     SupportsFindMode="true" SupportsRangesize="true" SupportsResetState="true"

                     SupportsSortCollection="true" Configuration="HadfFrameworkAMLocal" syncMode="Immediate"

                     xmlns="http://xmlns.oracle.com/adfm/datacontrol"/>

  </dataControlUsages>


在通过BindingContext查询DataControl从而获取其DataProvider的时候,需要使用如下方法获取AM的实例BindingContext.getDataSource("").getDataProvider();

需要特别注意的是,如果在同一个应用中包含多个DataBinding,在使用该方法查找DataControl的时候如果直接按id进行查找可能会报错,原因是在同一个应用中,如果包含多个DataBinding,那么在应用启动部署时会将这些DataBinding的全部put到当前应用的相关配置中

1
2
3
4
5
6
日志信息:
 [39] BindingContext.put( JmxDataControl@adfmeta_oracle_sysman_emai_adf_DataBindings_cpx, oracle.adf.model.binding.DCDataControlReference )
 [40] BindingContext.put( ADFConnectionsPageDef, oracle.adf.model.binding.DCBindingContainerReference )
 [41] BindingContext.put( BC4JConfigPageDef, oracle.adf.model.binding.DCBindingContainerReference )
 [45] BindingContext.put( HadfFrameworkAMDataControl@hand_hadf_common_view_DataBindings_cpx, oracle.adf.model.binding.DCDataControlReference )
 [46] BindingContext.put( hand_hadf_common_view_indexPageDef, oracle.adf.model.binding.DCBindingContainerReference )

然而在查找该id对应的DataControl时就无法知晓是从哪个DataBinding中获取,在获取时就会报错,解决该问题的方法就是在查找 DataControl时,在调用findDataSource("")方法时,将对应的DataBinding的Key传进去。

示例代码:

1
2
3
  ……
  HadfFrameworkAM hadfFrameworkAM =   (HadfFrameworkAM)BindingContext.getDataSource("HadfFrameworkAMDataControl@hand_hadf_common_view_DataBindings_cpx").getDataProvider()
  ……

3)通过DCBindingContainer获取

通过页面定义文件(PageDef)在DataBinding.cpx中定义的对应id,查找该PageDef的DCBindingContainder,再从该Container中调用getDataControl().getDataProvider()方法获取对应的AM实例。由于该方法是从 DCBindingContainer中获取,因此不会出现2)中提到的问题。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  ……
  private static synchronized HadfFrameworkAM getHadfAMInstance() {
    BindingContext bindingContext =
      (BindingContext)JSFUtils.getExpressionValue("#{data}");
    DCBindingContainer container =
      bindingContext.findBindingContainer(bindingContainerName);
    Object dataProvider = container.getDataControl().getDataProvider();
    if (dataProvider == null) {
      container.refresh(DCBindingContainer.PREPARE_MODEL);
      dataProvider = container.getDataControl().getDataProvider();
    }
    HadfFrameworkAM hadfFrameworkAM = (HadfFrameworkAM)dataProvider;
    return hadfFrameworkAM;
  }
  ……

相关文章:

  1. 资源绑定导致ADF应用严重的性能问题
  2. 为Backingbean创建基类

0 responses to 通过代码获取AM的实例

Leave a reply

You must be logged in to post a comment.